Silver Cow Party POJ - 3268 Spfa

思路

 因为是有向图且求去会最长的路所以用 Spfa 正向遍历一遍反向便利一遍就行

 head 数组要初始化两次

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int head[1010],d[1010],s[1010];
int cnt,n,m,x,h[100010][3];
bool vis[1010];
struct node
{
    int u;
    int v;
    int w;
    int next;
}p[100010];
void add(int u,int v,int w)
{
    p[cnt].u=u;
    p[cnt].v=v;
    p[cnt].w=w;
    p[cnt].next=head[u];
    head[u]=cnt++;
}
void spfa()
{
    for(int i=1;i<=n;i++)
    {
        d[i]=inf;
        vis[i]=0;
    }
    queue<int>q;
    q.push(x);
    vis[x]=1;
    d[x]=0;
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        vis[t]=0;
        for(int i=head[t];i!=-1;i=p[i].next)
        {
            node  e=p[i];
            if(d[e.v]>d[e.u]+e.w)
            {
                d[e.v]=d[e.u]+e.w;
                if(!vis[e.v])
                {
                    vis[e.v]=1;
                    q.push(e.v);
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
        s[i]+=d[i];
}
int main()
{
    cnt=0;
    scanf("%d%d%d",&n,&m,&x);
    memset(head,-1,sizeof(head));   //初始化
    memset(s,0,sizeof(s));
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&h[i][0],&h[i][1],&h[i][2]);   //将输入存到一个二维数组中以利于下次反向便利
        add(h[i][0],h[i][1],h[i][2]);
    }
    spfa();
    memset(head,-1,sizeof(head));   //记得便利前初始化
    for(int i=1;i<=m;i++)
        add(h[i][1],h[i][0],h[i][2]);
    spfa();
    sort(s+1,s+n+1);
    printf("%d\n",s[n]);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41837216/article/details/82749810