【洛谷 1186】 玛丽卡

来源:互联网 发布:杭州边锋网络官网 编辑:程序博客网 时间:2024/06/11 19:50

又是开错了数组……要记住。

#include <bits/stdc++.h>using namespace std;#define fi first#define se second#define pii pair<int,int>#define mp(a,b) make_pair(a,b)const int maxn = 1010;const int maxm = 1100010+100000;const int inf = 0x7fffffff/3;int _first[maxn], _next[maxm], _to[maxm], _dis[maxm], cnt, dis[maxn];int n, m;priority_queue <pii, vector<pii>, greater<pii> > q1;bool vis[maxn], used[maxm];pii pre[maxn];void add(int a, int b, int c){    _next[++cnt] = _first[a];    _first[a] = cnt;    _dis[cnt] = c;    _to[cnt] = b;}void dij1(){    while(!q1.empty()) q1.pop();    for(int i = 1; i <= n; i ++) dis[i] = inf, vis[i] = 0;    dis[n] = 0;    q1.push(mp(dis[n], n));    while(!q1.empty()){        pii t = q1.top();        q1.pop();        if(vis[t.se]) continue;        vis[t.se] = true;        if(vis[1]) return;        for(int i = _first[t.se]; i; i = _next[i]){            if(!vis[_to[i]] && dis[_to[i]] > dis[t.se] + _dis[i]){                dis[_to[i]] = dis[t.se] + _dis[i];                pre[_to[i]] = mp(t.se, i);                q1.push(mp(dis[_to[i]], _to[i]));            }        }    }}int dij2(){    while(!q1.empty()) q1.pop();    for(int i = 1; i <= n; i ++) dis[i] = inf, vis[i] = 0;    dis[n] = 0;    q1.push(mp(dis[n], n));    while(!q1.empty()){        pii t = q1.top();        q1.pop();        if(vis[t.se]) continue;        vis[t.se] = true;        if(vis[1] == 1) return dis[1];        for(int i = _first[t.se]; i; i = _next[i]){            if(!used[i] && !vis[_to[i]] && dis[_to[i]] > dis[t.se] + _dis[i]){                dis[_to[i]] = dis[t.se] + _dis[i];                q1.push(mp(dis[_to[i]], _to[i]));            }        }    }}int main(){    scanf("%d%d", &n, &m);    for(int i = 1; i <= m; i ++){        int a, b, c;        scanf("%d%d%d", &a, &b, &c);        add(a, b, c);        add(b, a, c);    }    dij1();    int ans = 0;    for(int i = 1; i != n; i = pre[i].fi){        used[pre[i].se] = 1;        ans = max(ans, dij2());        used[pre[i].se] = 0;    }    printf("%d", ans);    return 0;}


2 0
原创粉丝点击