poj 3268 Silver Cow Party(最短路径)

来源:互联网 发布:开票软件v2.0 编辑:程序博客网 时间:2024/06/06 03:32

题意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出。


思路:最短路径只需要从x到i的最短路径代表他们返回的最短路径,然后将所有边反过来,再从x到i的最短路径代表他们来参加聚会的最短路径,这样对应相加找出一个最大值就可以了,当然其实不需要将所有边反过来,只需要将map的行和列对换一下就可以了,数据比较大,floyd超时,用dijkstra比较好点。

#include <iostream>#include <stdio.h>using namespace std;#define MAXV 1010#define inf 1<<29int map[MAXV][MAXV],d[MAXV],dback[MAXV];bool vis[MAXV];int n,m,x;int dijkstra(){int i,j,v,mi;for(i=1;i<=n;i++){vis[i]=0;d[i]=map[x][i];dback[i]=map[i][x];}for(i=1;i<=n;i++){mi=inf;for(j=1;j<=n;j++)if(!vis[j] && d[j]<mi){v=j;mi=d[j];}vis[v]=1;for(j=1;j<=n;j++){if(!vis[j] && map[v][j]+d[v]<d[j])d[j]=map[v][j]+d[v];}}for(i=1;i<=n;i++) vis[i]=0;for(i=1;i<=n;i++){mi=inf;for(j=1;j<=n;j++)if(!vis[j] && dback[j]<mi){v=j;mi=dback[j];}vis[v]=1;for(j=1;j<=n;j++){if(!vis[j] && map[j][v]+dback[v]<dback[j])dback[j]=map[j][v]+dback[v];}}mi=-1;for(i=1;i<=n;i++){if(d[i]+dback[i]>mi)mi=d[i]+dback[i];}return mi;}int main(){int i,a,b,c,j;while(~scanf("%d%d%d",&n,&m,&x)){for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(i!=j) map[i][j]=inf;else map[i][j]=0;}for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);map[a][b]=c;}printf("%d\n",dijkstra());}return 0;}
0 0
原创粉丝点击