复杂度 o(n³)
当n为100时 ->100万
当n为1000时->10亿(会爆炸的)
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 100;
int map1[maxn][maxn];
int u,v,w;
int main(){
int n,m,i,j,k;
memset(map1,inf,sizeof(map1));
for(i = 1;i<=n;i++){
map1[i][i] = 0;
}
while(m--){
scanf("%d %d %d",&u,&v,&w);
map1[u][v] = map1[v][u] = w;
}
for(k = 1;k<=n;k++){
for(i = 1;i<=n;i++){
for(k = 1;k<=n;k++){
if(map1[i][j]>map1[i][k]+map1[k][j]){
map1[i][j]>map1[i][k]+map1[k][j];
}
}
}
}
printf("%d\n",map1[1][n]);
}
模板如上
过冬
Tags: 弗洛伊德 Dijk
Time Limit: 1 s Memory Limit: 32 MB
Description
天气逐渐变冷,年老体弱的越越鸟打算去南方某座温度适宜的城市过冬,但由于翅膀严重老化,最远飞行距离有限,请你为可怜的越越鸟计算飞行所需的最短距离,以让它能做好心理准备。
Input
输入包含多组测试数据。
每组输入第一行为两个正整数n(n<=20)和m(m<=n*(n-1)/2),n表示城市个数,m表示线段个数。(线段为两个城市间的连接线)
接下来m行,每行输入三个整数a,b,和l(l<=10^9),表示a市与b市之间存在一条线段,线段长度为l。(a与b不同)
每组最后一行输入两个整数x和y,表示问题:x为越越鸟现在所在的城市,y为越越鸟打算飞往过冬的城市。城市标号为1~n。
Output
对于每组输入,输出x市与y市之间的最短距离,如果x市与y市之间非连通,则输出“No path”。
Samples
input:
4 4
1 2 4
1 3 1
1 4 1
2 3 1
2 4
output:
3
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 100;
int map1[maxn][maxn];
int main(){
int n,m,a,b,l,j,k,i,x,y;
while(scanf("%d %d",&n,&m)!=EOF){
memset(map1,inf,sizeof(map1));
for(i = 1;i<=n;i++){
map1[i][i] = 0;
}
for(i = 0;i<m;i++){
scanf("%d %d %d",&a,&b,&l);
map1[a][b] = map1[b][a] = l;
}
for(k = 1;k<=n;k++){
for(i = 1;i<=n;i++){
for(j = 1;j<=n;j++){
if(map1[i][j] > map1[i][k] + map1[k][j]){
map1[i][j] = map1[i][k] + map1[k][j];
}
}
}
}
scanf("%d %d",&x,&y);
if(map1[x][y]==inf){
printf("No path\n");
}
else
printf("%d\n",map1[x][y]);
}
}
模板题解