题解 P1821 【[USACO07FEB]银牛派对Silver Cow Party】

· · 题解

嘿嘿,面前大佬皆用SPFA唯我用Floyd

先看一下数据范围:N≤1000,我滴妈呀,这个Floyd有点悬啊!

没关系,别忘了我们有O_2这个东西呢!开一下就过了呀!(虽然是卡着过的QAQ

那么直接上代码了!

// luogu-judger-enable-o2       //大家一定要开O2否则会T(这不是废话吗?)
#include<bits/stdc++.h>
using namespace std;
int ans=INT_MIN,dis[3005][3005],n,m,q,u,v,x,y;
int main()
{
    cin>>n>>m>>q;
    memset(dis,0x3f,sizeof(dis));    //Floyd初始值要赋为无限大,但是怕过int我们开的是0x3f而不是0x7f
    for(int i=1;i<=m;i++)
    {
        cin>>u>>v;
        cin>>dis[u][v];
    }
    for(int k=1;k<=n;k++)     //Floyd正片开始:三重循环!!!
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(i!=q)    //一定要加这句话啊不然就会WA
        {
            ans=max(ans,dis[i][q]+dis[q][i]);     //他是要过去再回来哦!!!!
        }
    }
    cout<<ans<<endl;
    return 0;
}

但是还是推荐SPFA不然考试就会T一片哦,Floyd仅供参考