题意:给出源点和边,边权为1,让你求从源点出发的最长路径,求出路径长度和最后地点,若有多组,输出具有最小编号的最后地点。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> using namespace std; const int maxn=110; int n,s,tot; //n:点的个数,s:源点 int dist[maxn]; //存储该点到源点的最长路径 int head[maxn]; int vis[maxn]; //用来在SPFA算法中标记点是否在队列中 struct Edge{ int to,next; }edge[5050]; void add(int u,int v){ edge[tot].next=head[u]; edge[tot].to=v; head[u]=tot++; } void SPFA(){ queue<int> q; int tmp,u,v; dist[s]=0; q.push(s); vis[s]=1; while(!q.empty()){ u=q.front(); q.pop(); vis[u]=0; //对u的所有出边的端点进行松弛操作,如果可以经过u使得源点到v的路径变长,则更新 for(int k=head[u];k!=-1;k=edge[k].next){ v=edge[k].to; if(dist[u]+1>dist[v]){ dist[v]=dist[u]+1; //若点v不在队列里,则加入到队列中 if(!vis[v]){ q.push(v); vis[v]=1; } } } } } int main() { int u,v,t=0; while(scanf("%d",&n)!=EOF){ if(n==0) break; memset(head,-1,sizeof(head)); memset(dist,0,sizeof(dist)); memset(vis,0,sizeof(vis)); tot=0; scanf("%d",&s); while(scanf("%d%d",&u,&v)!=EOF){ if(u==0 && v==0) break; add(u,v); } SPFA(); int ans=200,length=0; for(int i=1;i<=n;i++){ if(dist[i]>length){ length=dist[i]; ans=i; } else if(dist[i]==length && i<ans){ ans=i; } } printf("Case %d: The longest path from %d has length %d, finishing at %d. ",++t,s,length,ans); printf(" "); //ÉÙÁË»»ÐУ¬WA¡£¡£¡£ } return 0; }