Target
- Floyd算法
HDOJ 2544
Point
- 复习Floyd算法,详细可见: 数据结构与算法基础–第11周08–6.6图的应用8–6.6.2最短路径3–Floyd算法.
- 注意无穷大:为何程序员喜欢将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
Point
- 2066在2544的基础上,只选择一部分点间的最短路径,添加循环判断最小值即可。
- 此题需要剪枝操作,避免超时
- 很坑的地方是向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;
}
来源:CSDN
作者:_lluvia
链接:https://blog.csdn.net/qq_38213037/article/details/104114771