链接:点击打开链接
题意:有一些景点,看其中能从一个景点走至少要经过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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-19 19:49:31