本题为简单的floyd算法。
AC代码如下
#include<cstdio>
#include<cstring>
#include<iostream>
#define inf 99999999
#define N 105
using namespace std;
int e[N][N],dis[N][N];
int main()
{
int m,n,min,u;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
e[i][j]=e[j][i]=inf;
dis[i][j]=dis[j][i]=inf;
}
e[i][i]=0;
dis[i][i]=0;
}
int a,b,c;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(e[a][b]>c)
{
e[a][b]=e[b][a]=c;
dis[a][b]=dis[b][a]=c;
}
}
min=inf;
for(u=1;u<=n;u++)
{
for(int i=1;i<u;i++)
{
for(int j=i+1;j<u;j++)
{
if(min>dis[i][j]+e[i][u]+e[u][j])
{
min=dis[i][j]+e[i][u]+e[u][j];
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][j]>dis[i][u]+dis[u][j])
{
dis[i][j]=dis[i][u]+dis[u][j];
}
}
}
}
if(min<inf)
cout<<min<<endl;
else
cout<<"It's impossible."<<endl;
}
return 0;
}