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;
    }
  • 相关阅读:
    支付清结算之基本概念和入门
    支付清结算之账户和账务处理
    支付系统设计:支付系统的账户模型(一)
    Docker架构和原理
    Docker容器的原理、特征、基本架构、与应用场景
    Docker的用途与原理
    Random函数的安全性问题与SecureRandom
    nginx配置https
    CentOS Docker 安装
    Nginx能做什么
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3383547.html
Copyright © 2011-2022 走看看