zoukankan      html  css  js  c++  java
  • SPAF模板

    #include <iostream>
    #include <cstring>
    #include <queue>
    #include <cstdio>
    
    #define INF 0x3f3f3f
    using namespace std;
    
    const int L = 200000;
    
    struct Edge{
        int to;
        int next;
        int dis;
    }e[L*2];
    int n,m,s;
    int dist[L];
    bool tag[L];
    int num[L];
    int head[L];
    bool SPAF(int v0)
    {
        queue<int> q;
        dist[v0]=0;
        q.push(v0);
        num[v0]++;
        tag[v0]=true;
        while(!q.empty())
        {
            int t=q.front();
            q.pop();
            tag[t]=false;
            for(int i=head[t];i!=-1;i=e[i].next)
            {
                int v=e[i].to;
                if(dist[v]>dist[t]+e[i].dis)
                {
                    dist[v]=dist[t]+e[i].dis;
                    if(!tag[v])
                    {
                        tag[v]=true;
                        q.push(v);
                        num[v]++;
                        if(num[v]>n)  return false;
                    }
                }
            }
        }
        return true;
    }
    
    int main()
    {
        cin>>n>>m>>s;
        int u,v,w;
        for(int i=0;i<=n;i++)
        {
            head[i]=-1;
            dist[i]=INF;
            tag[i]=false;
            num[i]=0;
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            e[i].to=v;
            e[i].dis=w;
            e[i].next=head[u];
            head[u]=i;
        }
        if(SPAF(s))
        {
            for(int i=1;i<=n;i++)
                if(dist[i]<INF)
                    cout<<dist[i]<<endl;
                else
                    cout<<"NO PATH"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    vb笔记
    linux学习笔记
    linnux--shell
    # 用类来封装动态数组:分文件编写
    面向对象
    c++2
    c++1
    答疑:指针数组字符串
    文件操作
    用函数封装实现对一个数组增删改查
  • 原文地址:https://www.cnblogs.com/asuml/p/6653491.html
Copyright © 2011-2022 走看看