洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party spfa算法

题目链接:

https://www.luogu.org/problemnew/show/P1821

思路:

1:由x到各点跑spfa,是各牛回家最短路径

2:反向建图,从x点跑spfa,就是由各点到x,就是各牛参加活动的最短路径

算法:

spfa算法

#include
using namespace std;

const int maxn=1001;
vector >e[maxn];
vector >k[maxn];
int n,m,x,a,b,c;
int ing[maxn],d1[maxn],d2[maxn];

void init(int *p)
{
    for(int i=1;i<=n;i++)
    {
        ing[i]=0;
        p[i]=1e9;
    }
}

void spfa(vector >*p,int *h)
{
    init(h);
    queueq;
   q.push(x);
   h[x]=0;
   ing[x]=1;
   while(!q.empty())
   {
         int now=q.front();
         q.pop();
         ing[now]=0;
         for(int i=0;ih[now]+p[now][i].second)
             {
                h[v]=h[now]+p[now][i].second;
                 if(ing[v])continue;
                 q.push(v);
             }
         }
   }
}
int main()
{
   cin>>n>>m>>x;
   for(int i=0;i>a>>b>>c;
       e[a].push_back(make_pair(b,c));
       k[b].push_back(make_pair(a,c));
   }
   spfa(e,d1);
   spfa(k,d2);
   m=0;
   for(int i=1;i<=n;i++)
   {
       m=max(d1[i]+d2[i],m);
   }
   cout<

 

你可能感兴趣的:(图spfa)