想看更多的解题报告: http://iyenn.com/rec/1824570.html
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出
解题思路:最短路径只需要从x到i的最短路径代表他们返回的最短路径,然后将所有边反过来,再从x到i的最短路径代表他们来参加聚会的最短路径,这样对应相加找出一个最大值就可以了,当然其实不需要将所有边反过来,只需要将map的行和列对换一下就可以了,数据比较大,所以floyd超时,用dijkstra比较好点
- /*
- Memory 4136K
- Time 63MS
- */
- #include
- using namespace std;
- #define MAXV 1010
- #define inf 1<<29
-
- int 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]
- v=j;
- mi=d[j];
- }
- vis[v]=1;
-
- for(j=1;j<=n;j++){
- if(!vis[j] && map[v][j]+d[v]
- 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]
- v=j;
- mi=dback[j];
- }
- vis[v]=1;
-
- for(j=1;j<=n;j++){
- if(!vis[j] && map[j][v]+dback[v]
- 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;
- }
注:本文转载自blog.csdn.net的wangjian8006的文章"http://blog.csdn.net/wangjian8006/article/details/7872048"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
评论记录:
回复评论: