您的位置:首页 > 其它

POJ 3268 Silver Cow Party(Dijkstra算法)

2017-05-13 10:21 387 查看
http://poj.org/problem?id=3268

有编号为1-N的牛,它们之间存在一些单向的路径。给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求这些牛中所花的最长的来回时间是多少。

这个题可以将被访问的牛看作是 源点  不管是牛来拜访它 还是牛回去  都看成是  源点牛去拜访其他牛即可   这里只需要将时间互换一下即可

AC代码:
#include <stdio.h>
#include <string.h>
#define maxinf 0x3f3f3f3f

int N,M,D;
int A,B,C;
int map[1100][1100];
int vis[1100];
int dis[1100];
int count[1100];

void Dijkstra(){
int v;
for (int i=1;i<=N;i++){
dis[i]=map[D][i];
vis[i]=0;
}

dis[D]=0;
vis[D]=1;

for(int i=1;i<=N;i++){
int mindis=maxinf;
for (int j=1;j<=N;j++){
if (!vis[j]&&mindis>dis[j]){
mindis=dis[j];
v=j;
}
}
vis[v]=1;
for (int j=1;j<=N;j++){
if (!vis[j]&&dis[j]>map[v][j]+dis[v]){
dis[j]=map[v][j]+dis[v];
}
}
}
}

int main(){
int max=-1;
scanf ("%d%d%d",&N,&M,&D);

for (int i=1;i<=N;i++){
for (int j=1;j<=N;j++){
if (i!=j)
map[i][j]=maxinf;
else
map[i][j]=0;
}
}

for (int i=1;i<=M;i++){
scanf ("%d%d%d",&A,&B,&C);
map[A][B]=C;
}

Dijkstra();
for (int i=1;i<=N;i++){
count[i]=dis[i];
}

memset(dis,0,sizeof(dis));
int temp;
for (int i=1;i<=N;i++){
for (int j=i;j<=N;j++)//将数组逆置  败在数组逆置  T_T
{
temp=map[i][j];
map[i][j]=map[j][i];
map[j][i]=temp;
}
}
Dijkstra();
for (int i=1;i<=N;i++){
if (max<count[i]+dis[i]){
max=count[i]+dis[i];
}
}
printf ("%d\n",max);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路问题