UVA 10000(SPFA+邻接表)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<list>
#include<queue>
#define mm(a,b) memset(a,b,sizeof(a))
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define MAXN 0x3fffffff
#define PI acos(-1.0)
#define E exp(1.0)
using namespace std;

//#define debug

const int maxn=6000;

int u[maxn],v[maxn];
int n,len;
int nextt[maxn],first[maxn];
int que[99999];
int dis[1025];
bool vis[1025];

int main()
{
    #ifdef debug
    freopen("in.txt","r",stdin);
//    freopen("out2.txt","w",stdout);
    #endif // debug
    int casei=1;
    int st,en;
    while(scanf("%d",&n)==1&&n){
        mm(dis,0);
        mm(vis,0);
        mm(first,-1);

        int length=-1;
        scanf("%d",&st);
        int a,b;
        len=0;
        while(scanf("%d%d",&a,&b)&&(a||b)){
            u[len]=a;v[len]=b;
            len++;
        }

        for(int i=0;i<len;i++){
            nextt[i]=first[u[i]];
            first[u[i]]=i;
        }
        int l=0,r=0;
        que[r++]=st;
        vis[st]=1;

        while(l!=r){
            int t=que[l++];
            vis[t]=0;
            int k=first[t];
            while(k!=-1){
                if(dis[v[k]]<dis[u[k]]+1){
                    dis[v[k]]=dis[u[k]]+1;
                    if(!vis[v[k]]){
                        vis[v[k]]=1;
                        que[r++]=v[k];
                    }
                }
                k=nextt[k];
            }

        }
        for(int i=1;i<=n;i++){
            if(dis[i]>length){
                length=dis[i];
                en=i;
            }
        }
        if(length==0) en=st;
        printf("Case %d: The longest path from %d has length %d, finishing at %d.\n\n",casei++,st,length,en);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/80740738