zoukankan      html  css  js  c++  java
  • 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.
    ",++t,s,length,ans);
            printf("
    ");  //ÉÙÁË»»ÐУ¬WA¡£¡£¡£
        }
        return 0;
    }
  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3383547.html
Copyright © 2011-2022 走看看