poj 3268 最短路
题意:求从A点到所有点的最短距离 + 所有点到A点的最短距离 之和的最大值
正反两次dijkstra
#define M 1001 struct Node{ int v,val,next; }edge[2*M*M]; int len; int head1[M],head2[M], n,rt; int dist1[M],dist2[M], pre[M],vis[M]; void add(int &kind,int v,int val){//起点 终点 权值 edge[len].next=kind; edge[len].v=v; edge[len].val=val; kind=len++; } struct nod{ int u,dist; }; struct cmp{ bool operator()(nod e1,nod e2) { return e1.dist>e2.dist;//最小堆 } }; priority_queue<nod,vector<nod>,cmp> heap; void Dijkstra(int head[],int dist[]){ dist[rt]=0; //pre[rt]=-1; nod h; h.u=rt; h.dist=0; heap.push(h); while(!heap.empty()){ h=heap.top(); heap.pop(); int u=h.u; vis[u]=1; for(int i = head[u]; i != -1; i = edge[i].next){ int v = edge[i].v, val = edge[i].val; if(vis[v]) continue; if(dist[v] > dist[u] + val){ dist[v] = dist[u] + val; //pre[v] = u; } h.u=v; h.dist=dist[v]; heap.push(h); } } } void init(){ //len = 0; memset(head1,-1, sizeof head1); memset(head2,-1, sizeof head2); memset(dist1, 1, sizeof dist1); memset(dist2, 1, sizeof dist2); memset( vis, 0, sizeof vis ); //memset( pre, 1, sizeof pre ); while(!heap.empty()) heap.pop(); } void build(){ int m,a,b,c; scanf("%d%d%d",&n,&m,&rt); while(m--){ scanf("%d%d%d",&a,&b,&c); add(head1[a],b,c); add(head2[b],a,c); } } int main(){ init(); build(); Dijkstra(head1,dist1); memset(vis,0,sizeof vis); while(!heap.empty()) heap.pop(); Dijkstra(head2,dist2); int ma=0; FOE(i,1,n) checkmax(ma,dist1[i]+dist2[i]); cout<<ma<<endl; return 0; }
#define M 1001 struct Node{ int v,val,next; }edge[2*M*M]; int len; int head1[M],head2[M], n, rt; int dist1[M],dist2[M], pre[M], vis[M]; void add(int &kind, int v, int val){//起点 终点 权值 edge[len].next = kind; edge[len].v = v; edge[len].val = val; kind = len++; } queue<int> que; void SPFA(int head[],int dist[]){ que.push(rt); vis[rt]=1; pre[rt]=-1; dist[rt]=0; while( !que.empty() ){ int u = que.front(); que.pop(); vis[u] = 0; //cout<<u<<endl; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v, val = edge[i].val; if(dist[v] > dist[u]+val) { dist[v] = dist[u]+val; pre[v]=u; if( !vis[v] ){ vis[v] = 1; que.push(v); } } } } } void init(){ len = 0; memset(head1,-1, sizeof head1); memset(head2,-1, sizeof head2); memset(dist1, 1, sizeof dist1); memset(dist2, 1, sizeof dist2); //memset( vis, 0, sizeof vis ); memset( pre, 1, sizeof pre ); while(!que.empty()) que.pop(); } void build(){ int m, a, b, c; scanf("%d%d%d", &n, &m, &rt); while( m-- ){ scanf("%d%d%d", &a, &b, &c); add(head1[a], b, c); add(head2[b], a, c); } } int main(){ READ // init(); build(); SPFA(head1,dist1); memset( vis, 0, sizeof vis );while(!que.empty()) que.pop(); SPFA(head2,dist2); int ma=0; FOE(i,1,n) checkmax(ma,dist1[i]+dist2[i]); printf("%d\n",ma); return 0; }