POJ 3268 Silver Cow Party(Dijkstra)
http://poj.org/problem?id=3268
题意:
有N头牛要去参加牛X那里的聚会,现在除了X牛外,其他N-1头牛都要走到X牛那里去.给你M条有向边,现在问你任意一头牛从自己的位置走到X牛那,然后再走回来(来回都选择最短路径走)的话,需要的总时间的最大值是多少?即从所有N-1头牛中找那个最大的来回时间.
分析:
建立两个图,一个输入的有向图,代表从x点到其他所有点的最短距离、
然后建立他的反向图,代表从其他点到x点的距离,因为这里是反向,所以求x到其他点的距离即可。
最后求往返路程和的最大值,即两个图到某个点的和最大。
#include<iostream> #include<cstdio> #include<cstring > #include <cmath> #include<algorithm> #include<queue> using namespace std; const int maxn=1000+10; #define inf 0x3f3f3f3f struct edge { int from,to, dist; edge(int f,int t,int w):from(f),to(t),dist(w){} }; struct heapnode { int d,u; heapnode(int d1,int u1):d(d1),u(u1){} bool operator <(const heapnode&tmp)const { return d>tmp.d; } }; struct Dijkstrra { int n,m; vector<edge>edges; vector<int >g[maxn]; bool done[maxn]; int d[maxn]; void init(int n) { this->n=n; for(int i=0;i<n;i++) g[i].clear(); edges.clear(); } void addedge(int from,int to,int dist) { edges.push_back(edge(from,to,dist)); m=edges.size(); g[from].push_back(m-1); } void dijkstra(int s) { priority_queue<heapnode>q; for(int i=0;i<n;i++) { d[i]=inf; } d[s]=0; memset(done,false,sizeof done); q.push(heapnode(0,s)); while(!q.empty()) { heapnode x=q.top(); q.pop(); int u=x.u; if(done[u])continue; done[u]=true; for(int i=0;i<g[u].size();i++) { edge &e=edges[g[u][i]]; if(d[e.to]>d[u]+e.dist) { d[e.to]=d[u]+e.dist; q.push(heapnode(d[e.to],e.to)); } } } } }Dj_1,Dj_2; int main() { int n,m,x; scanf("%d%d%d",&n,&m,&x); x--; Dj_1.init(n); Dj_2.init(n); while(m--) { int u,v,d; scanf("%d%d%d",&u,&v,&d); u--,v--; Dj_1.addedge(u,v,d); Dj_2.addedge(v,u,d); } Dj_1.dijkstra(x); Dj_2.dijkstra(x); int maxe=-1; for(int i=0;i<n;i++) if(i!=x) { maxe=max(maxe,Dj_1.d[i]+Dj_2.d[i]); } printf("%d\n",maxe); return 0; }