Floyd算法模板

复杂度 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]);
	}
}

模板题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值