看了别人的题解,然后做出来的。
/*************************************************************************
> File Name: main.cpp
> Author:Eagles
> Mail:None
> Created Time: 2018年09月08日 星期六 15时36分55秒
> Description:HDU1599
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define N 110
int n,m;
int dis[N][N],mp[N][N];
const int INF=111111;
void init()
{
for (int i=0; i<n; i++)
{
for (int j=0; j<n ;j++)
{
dis[i][j]=INF;
mp[i][j]=INF;
if (i==j)
dis[i][j]=mp[i][j]=0;
}
}
for (int i=0; i<m; i++)
{
int a,b,val;
scanf("%d%d%d",&a,&b,&val);
if (dis[a-1][b-1]>val)
dis[a-1][b-1]=dis[b-1][a-1]=val;
if (mp[a-1][b-1]>val)
mp[a-1][b-1]=mp[b-1][a-1]=val;
}
}
void floyd()
{
int sum=INF;
for (int i=0; i<n; i++)
{
for (int j=0; j<i; j++)
{
for (int k=j+1; k<i; k++)
{
sum=min(sum,dis[j][k]+mp[j][i]+mp[i][k]);
}
}
for (int j=0; j<n; j++)
{
for (int k=0; k<n; k++)
{
dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]);
}
}
}
if (sum >= INF)
printf("It's impossible.\n");
else
printf("%d\n",sum);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while (~scanf("%d%d",&n,&m))
{
init();
floyd();
}
return 0;
}
在上述代码中,最外层的i点被当做j,k之外的第三点,i->j,j->k,k->i构成一个环,在更新dis[j][k]之前需要先进行判断,以保证k点没有在dis[j][k]之中(不然构不成环).