您的位置:首页 > 其它

poj 3268 Silver Cow Party(最短路)

2017-10-06 12:28 483 查看
N头牛,求这些牛从他们的位置走到x后,再返回到x的最短路(走不到x的不算)。选出最短路中的最大值,即结果。图是有向图。

首先求x到每个位置最短路,dijkstra,然后再求每个点到x的最短路。求每个点到x的最短路,把矩阵转置一下, 就是x到每个点的最短路了。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

const int INF = 0x3f3f3f3f;
const int MAXN = 1010;
int G[MAXN][MAXN];
int book[MAXN];
int dis[2][MAXN];
int n,m,x;

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