UVA 10000 Longest Paths (SPFA算法,模板题)

题意:给出源点和边,边权为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.\n",++t,s,length,ans);
        printf("\n");  //ÉÙÁË»»ÐУ¬WA¡£¡£¡£
    }
    return 0;
}

 

 

posted @ 2013-10-23 09:23  辰曦~文若  阅读(405)  评论(0编辑  收藏  举报