码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1599

时间:2015-08-19 20:36:32      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

链接:点击打开链接

题意:有一些景点,看其中能从一个景点走至少要经过2个其他不同的景区,而且不能重复经过同一个景区,每条路线需要一些花费,找出一条花费最少的路线,如果不能输出It‘s impossible.

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxx 99999999
using namespace std;
int dis[105][105],s[105][105];
int n,m;
int floyd(){
    int i,j,k,ans;
    ans=maxx;
    for(k=1;k<=n;k++){
        for(i=1;i<k;i++)
        for(j=i+1;j<k;j++)                      //求的是可能经过k-1的i到j的花费最小值+s[j][k]+s[k][i],也就是从i开始
        ans=min(ans,dis[i][j]+s[j][k]+s[k][i]); //可能成环的最小值
        for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    }                                           //求的是可能经过k的i到j的花费最小值
    return ans;
}
int main(){                                     //就是求无向图最小环问题
    int i,j,a,b,c,temp;
    while(scanf("%d%d",&n,&m)!=EOF){
        for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        dis[i][j]=s[i][j]=maxx;
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            if(s[a][b]>c){                      //这个要注意,他可能有重边,也就是同样的路径可能有两个不同的值
            dis[a][b]=dis[b][a]=c;
            s[a][b]=s[b][a]=c;
            }
        }
        temp=floyd();
        if(temp<maxx)
        printf("%d\n",temp);
        else
        printf("It's impossible.\n");
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu1599

标签:

原文地址:http://blog.csdn.net/stay_accept/article/details/47784383

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!