http://www.cnblogs.com/Yz81128/archive/2012/08/15/2640940.html 好的文章
从A点开始经过最少两个点回到A点所需最小花费
#include<stdio.h>
#include<string.h>
#define MAX 111
#define inf 0xfffffff
int dist[MAX][MAX];
int g[MAX][MAX];
int Min(int x,int y)
{
return x<y?x:y;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j,k,a,b,c,ans=inf;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j) g[i][j]=dist[i][j]=0;
else g[i][j]=dist[i][j]=inf;
}
}
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
g[a][b]=g[b][a]=dist[a][b]=dist[b][a]=Min(c,g[a][b]);
}
for(k=1;k<=n;k++)
{
for(i=1;i<k;i++)
{
for(j=i+1;j<k;j++)
ans=Min(ans,g[i][k]+g[k][j]+dist[i][j]);
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dist[i][j]=Min(dist[i][j],dist[i][k]+dist[k][j]);
}
if(ans>=inf)
printf("It's impossible.\n");
else
printf("%d\n",ans);
}
return 0;
}