题目大意:来自n个农场的n头牛去一个给定的x农场吃草,来回都走最短路,这几个牛所走过的最大的路是多少。
算法思想:spfa的应用,对每头牛去的时候搞一次spfa,回来的时候在搞一次spfa,再将这两段距离之和相加。最后在维护一下最大值输出即可。
如果不大清楚spfa算法,可以参考下http://huyifan951124.iteye.com/blog/2315252
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define INF -0x3f3f3f3f #define INF2 0x3f3f3f3f int n, m, x; int a,b,c,e,Max,flag,flag2; typedef struct Edge { int u; int v; int c; }; Edge edges[200050]; int next[200050],head[1005],dist[1005]; bool visited[1005]; void addnode(int u,int v,int c) { edges[e].u=u; edges[e].v=v; edges[e].c=c; next[e]=head[u]; head[u]=e++; } bool relax(int u,int v,int c) { if(dist[v]>dist[u]+c) { dist[v]=dist[u]+c; return true; } return false; } int spfa(int src,int x) { memset(visited,false,sizeof(visited)); for(int i=1;i<=n;i++) { dist[i]=INF2; } dist[src]=0; queue<int>que; que.push(src); visited[src]=true; while(!que.empty()) { int q=que.front(); que.pop(); visited[q]=false; for(int i=head[q];i+1;i=next[i]) { if(relax(q,edges[i].v,edges[i].c)&&!visited[edges[i].v]) { visited[edges[i].v]=true; que.push(edges[i].v); } } } return dist[x]; } int main() { memset(head,-1,sizeof(head)); memset(next,-1,sizeof(next)); scanf("%d%d%d",&n,&m,&x); e=1;Max=INF; for(int i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); addnode(a,b,c); } for(int i=1;i<=n;i++) { flag=-1; if(i==x) continue; flag=spfa(i,x); flag2=spfa(x,i); if(Max<(flag2+flag)) Max=flag2+flag; } printf("%d\n",Max); return 0; }