农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共
有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最少的路线.那么,用时最多的奶牛需要多少时间来回呢?
第1行:三个用空格隔开的整数.
第2行到第M+1行,每行三个用空格隔开的整数:Ai, Bi,以及Ti.表示一条道路的起点,终点和需要花费的时间.
唯一一行:一个整数: 所有参加聚会的奶牛中,需要花费总时间的最大值.
样例说明:
共有4只奶牛参加聚会,有8条路,聚会位于第2个农场.
第4只奶牛可以直接到聚会所在地(花费3时间),然后返程路线经过第1和第3个农场(花费7时间),总共10时间.
Silver
spfa水题,值得借鉴的是求每个农场到x的最短距离只要把边全部反向,求x的单源最短路。
因此求两次最短路即可。
#include <iostream> #include <cstring> #include <algorithm> #include <cstdlib> #include <cstdio> #include <queue> #define inf 0x3f3f3f3f using namespace std; int n,m,f,ans,d[1005][3],inq[1005],tot=0,h[1005][3]; struct edge { int y,v,ne; }e[200005][3]; void Addedge(int k,int x,int y,int v) { if (!k) tot++; e[tot][k].y=y; e[tot][k].ne=h[x][k]; e[tot][k].v=v; h[x][k]=tot; } void spfa(int k) { for (int i=1;i<=n;i++) inq[i]=0,d[i][k]=inf; d[f][k]=0; queue<int> q; q.push(f),inq[f]=1; while (!q.empty()) { int x=q.front(); q.pop(); inq[x]=0; for (int i=h[x][k];i;i=e[i][k].ne) { int y=e[i][k].y; if (d[y][k]>d[x][k]+e[i][k].v) { d[y][k]=d[x][k]+e[i][k].v; if (!inq[y]) q.push(y),inq[y]=1; } } } } int main() { scanf("%d%d%d",&n,&m,&f); for (int i=1;i<=m;i++) { int x,y,v; scanf("%d%d%d",&x,&y,&v); Addedge(0,x,y,v); Addedge(1,y,x,v); } spfa(0); spfa(1); int ans=0; for (int i=1;i<=n;i++) ans=max(ans,d[i][0]+d[i][1]); printf("%d\n",ans); return 0; }