HDOJ Floyd算法

回眸只為那壹抹淺笑 提交于 2020-01-30 17:04:44

Target

  • Floyd算法

HDOJ 2544

HDOJ2544

Point

  1. 复习Floyd算法,详细可见: 数据结构与算法基础–第11周08–6.6图的应用8–6.6.2最短路径3–Floyd算法.
  2. 注意无穷大:为何程序员喜欢将INF设置为0x3f3f3f3f.

Code

#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
int map[111][111];//较大数组写成全局变量
int main() {
	int n,m,i,j,k;
	while(cin>>n>>m && (n||m)){
		//initialize
		for(i=1;i<=n;++i)
			for(j=1;j<=n;++j)
				map[i][j]=inf;
		//input
		for(i=1;i<=m;++i){
			int a,b,c;
			cin>>a>>b>>c;
			map[a][b]=c;
			map[b][a]=c;
		}
		
		for(k=1;k<=n;++k){
			for(i=1;i<=n;++i){
				for(j=1;j<=n;++j){
					if(map[i][j]>map[i][k]+map[k][j])
						map[i][j]=map[i][k]+map[k][j];	
				}
			}
		}
		cout<<map[1][n]<<endl;//output the shortest path length
	}
	return 0;
}

HDOJ 2066

HDOJ2066

Point

  1. 2066在2544的基础上,只选择一部分点间的最短路径,添加循环判断最小值即可。
  2. 此题需要剪枝操作,避免超时
  3. 很坑的地方是向map输入数据时,原先我按照2544的做法:
	cin>>a>>b>>c;
	map[a][b]=c;
	map[b][a]=c;

提交是wrong answer,检查多次后将输入修改为:

	if(map[a][b]>time)
		map[a][b]=map[b][a]=time;

并且在初始化时,对角线上的元素赋值为0后,AC了(我也不懂为什么)

	for(i=1;i<L;++i){
		map[i][i]=0;
		for(j=1;j<i;++j)
			map[i][j]=map[j][i]=inf;
	}

Code

#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int L = 1005;
int map[L][L];
int city[L];//邻近城市
int des[L];//目的地

int main() {
	int t,s,d,i,j,k,max,min;
	while(cin>>t>>s>>d){
		//初始化
		for(i=1;i<L;++i){
			map[i][i]=0;
			for(j=1;j<i;++j)
				map[i][j]=map[j][i]=inf;
		}		
		max=0;
		//输入
		for(i=1;i<=t;++i){
			int a,b,time;
			cin>>a>>b>>time;
			if(map[a][b]>time)
				map[a][b]=map[b][a]=time;
			b=(b>a)?b:a;
			max=(max>b)?max:b;
		}
		for(i=1;i<=s;++i)
			cin>>city[i];
		for(i=1;i<=d;++i)
			cin>>des[i];
		//Floyd算法
		for(k=1;k<=max;++k){
			for(i=1;i<=max;++i){
				if(map[i][k]!=inf){//剪枝操作
					for(j=1;j<=max;++j){
						if(map[i][j]>map[i][k]+map[k][j])
							map[i][j]=map[i][k]+map[k][j];
					}
				}
			}
		}
		min=inf;
		for(i=1;i<=s;++i){
			for(j=1;j<=d;++j){
				int a=city[i],b=des[j];
				if(min>map[a][b])
					min=map[a][b];			
			}
		}
		cout<<min<<endl;		
	}
	return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!