!!!!!!同样坑了我好久的题,因为是双向路径,所以每次输入W的时候要考虑W和已有路径的大小,map[a][b] = map [ b ][a]= min(map[a][b],w);
FLOyd
#include <iostream>
#include <stdio.h>#include <string.h>
#define maxn 300
#define INF 1000000
using namespace std;
int map[maxn][maxn];
int n,m;
void Flo( )
{
for( int k = 0; k <n; k++)
for( int i = 0; i < n; i++)
for( int j = 0; j < n; j++)
{
if(map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
}
return ;
}
int main()
{
int a,b,w;
while(scanf("%d",&n)!= EOF)
{
for( int i = 0; i<n; i++)
for( int j = 0; j<n; j++)
{
map[i][j] = (i == j ? 0 : INF);
map[j][i] = map[i][j];
}
scanf("%d",&m);
for( int i = 0 ;i < m; i++)
{
scanf("%d%d%d",&a,&b,&w);
map[a][b] = map[b][a] = min(map[b][a],w);
}
Flo();
scanf("%d%d",&a,&b);
if(map[a][b] != INF)
//cout<<map[a+1][b+1]<<endl;
printf("%d\n",map[a][b]);
else if(a == b)
printf("0\n");
else
//cout<<"-1"<<endl;
printf("-1\n");
}
}
dij
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int maxn = 200 + 10;
- const int INF = 1000000000;
- int d[maxn][maxn], G[maxn][maxn];
- int main()
- {
- int N, M, i, j, k, u, v, w, S, T;
- while(scanf("%d%d", &N, &M) == 2)
- {
- for(i = 0; i < N; i++)
- for(j = 0; j < N; j++)
- G[i][j] = i == j ? 0 : INF;
- for(i = 0; i < M; i++) //建图
- {
- scanf("%d%d%d", &u, &v, &w);
- G[u][v] = G[v][u] = min(G[u][v], w); //最坑人的地方!!!
- }
- for(i = 0; i < N; i++) //赋初值
- for(j = 0; j < N; j++)
- d[i][j] = i == j ? 0 : INF;
- bool vis[maxn];
- for(i = 0; i < N; i++) //从i到任意点的最短距离
- {
- memset(vis, 0, sizeof(vis));
- for(j = 0; j < N; j++) //N次寻路
- {
- int x, y = INF;
- for(k = 0; k < N; k++)
- if(!vis[k] && d[i][k] <= y)
- y = d[i][x = k];
- vis[x] = 1;
- for(k = 0; k < N; k++)
- d[i][k] = min(d[i][k], d[i][x] + G[x][k]);
- }
- }
- scanf("%d%d", &S, &T);
- if(d[S][T] == INF) printf("-1\n");
- else printf("%d\n", d[S][T]);
- }
- return 0;
- }