题目来源:HDU 1599 find the mincost route
题意:求最小的3点组成的环
思路:floyd
http://blog.sina.com.cn/s/blog_476a25110100mag6.html
http://www.cppblog.com/mythit/archive/2009/04/21/80579.aspx
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 110;
int a[maxn][maxn];
int d[maxn][maxn];
int n, m, ans;
void floyd()
{
for(int k = 1; k <= n; k++)
{
for(int i = 1; i < k; i++)
{
for(int j = i+1; j < k; j++)
{
ans = min(ans, d[i][j]+a[i][k]+a[k][j]);
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
d[i][j] = min(d[i][j], d[i][k]+d[k][j]);
}
}
}
}
int main()
{
while(scanf("%d %d", &n, &m) != EOF)
{
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
if(i == j)
a[i][j] = d[i][j] = 0;
else
a[i][j] = d[i][j] = 99999999;
}
}
while(m--)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
if(a[u][v] > w)
{
a[u][v] = w;
a[v][u] = w;
d[u][v] = w;
d[v][u] = w;
}
}
ans = 99999999;
floyd();
if(ans == 99999999)
puts("It's impossible.");
else
printf("%d\n", ans);
}
return 0;
}