【BZOJ 1631】 [Usaco2007 Feb]Cow Party


1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 507 Solved: 377
[ Submit][ Status] Description 农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共 有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最少的路线.那么,用时最多的奶牛需要多少时间来回呢? Input 第1行:三个用空格隔开的整数.
第2行到第M+1行,每行三个用空格隔开的整数:Ai, Bi,以及Ti.表示一条道路的起点,终点和需要花费的时间.
Output 唯一一行:一个整数: 所有参加聚会的奶牛中,需要花费总时间的最大值.
Sample Input 4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
Sample Output 10
HINT
样例说明:

共有4只奶牛参加聚会,有8条路,聚会位于第2个农场.

第4只奶牛可以直接到聚会所在地(花费3时间),然后返程路线经过第1和第3个农场(花费7时间),总共10时间.



Source Silver


spfa水题,值得借鉴的是求每个农场到x的最短距离只要把边全部反向,求x的单源最短路。


因此求两次最短路即可。



#include #include #include #include #include #include #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 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; }

【【BZOJ 1631】 [Usaco2007 Feb]Cow Party】

【BZOJ 1631】 [Usaco2007 Feb]Cow Party
文章图片


    推荐阅读