您的位置:首页 > 其它

POJ 3268 Silver Cow Party(dijkstra)

2014-04-10 18:41 337 查看
题意:

有N(1≤N≤1000)个农场,编号为1~N,每个农场有一头奶牛。这些奶牛将参加在#X(1≤X

≤N)号农场举行的派对。这N 个农场之间有M(1≤M≤100,000)条单向路,通过第i 条路将需要

花费Ti(1≤Ti≤100)单位时间。

每头奶牛必须走着去参加派对。派对开完以后,返回到它的农场。每头奶牛都很懒,所以总

是选择一条具有最短时间的最优路。每头奶牛的往返路线是不一样的,因为所有的路都是单向的。

对所有的奶牛来说,花费在去派对的路上和返回农场的最长时间是多少?

思路:

读不懂题意略坑。。。

用矩阵+dijkstra来实现,若是反向的话,则转置矩阵,map[i][j]原本的值就变成了map[j][i]

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string.h>
using namespace std;

const int INF = 1e9;
const int N = 1010;
int map

,dis
,vis
,go
;
int n,m,x;

void dij()
{
int i,j;
for(i = 1; i<= n ;i++)
{
dis[i] = INF;
vis[i] = 0;
}
for(i=1;i<=n;i++)
dis[i]=map[x][i];
dis[x] = 0;
vis[x] = 1;
for(i=1;i<n;i++)
{
int t = INF;
int p;
for(j=1;j<=n;j++)
{
if(!vis[j]&&t>dis[j])
{
t=dis[j];
p=j;
}
}
vis[p]=1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>dis[p]+map[p][j])
dis[j] = dis[p] + map[p][j];
}
}
}

void  tra()
{
int t,i,j;
for(i = 1; i <= n; i++)
for(j = 1; j <= i; j++)
{
t = map[i][j];
map[i][j] = map[j][i];
map[j][i] = t;
}
}

int main()
{
int i,j,t,u,v,c;
while(scanf("%d%d%d",&n,&m,&x) != EOF)
{
memset(map,0,sizeof(map));
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++ )
map[i][j] = INF;
while(m--)
{
scanf("%d%d%d",&u,&v,&c);
map[u][v] = c;
}
dij();
for(i = 1; i <= n; i++)
go[i] = dis[i];
tra();
dij();
int ans = 0;
for(i = 1; i<= n; i++)
if(dis[i] + go[i] > ans)
ans = dis[i] + go[i];
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: