【BZOJ 1631】 [Usaco2007 Feb]Cow Party
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】
文章图片
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长