floyd算法可以解决有向图,负权的问题 但时间复杂度为O(n^3)
用到了动态规划思想:
dpi,j,k=min(dp i,j,k-1 , dpi,k,k-1+dpk,j,k-1)
代码如下
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int map[105][105];
int n, m;
void floyd(int s, int e)
{
int i, j, k;
for (k = 1;k <= n;k++)
for (i = 1;i <= n;i++)
for (j = 1;j <= n;j++)
if (map[i][k] && map[k][j] && (map[i][k] + map[k][j]<map[i][j] || map[i][j] == 0))
map[i][j] = map[i][k] + map[k][j];
cout << map[s][e] << endl;
}
int main()
{
int a, b, c;
while (cin >> n >> m)
{
if (n == 0 && m == 0)
break;
memset(map, 0, sizeof(map));
while (m--)
{
cin >> a >> b >> c;
map[a][b] = c;
map[b][a] = c;
}
floyd(1, n);
}
return 0;
}