蓝桥练习07-Floyd练习(洛谷-P3905 道路重建)

代码骑士
优质创作者: 游戏开发技术领域
2023-04-07 20:33:38

题目描述

从前,在一个王国中,在�n个城市间有�m条道路连接,而且任意两个城市之间至多有一条道路直接相连。在经过一次严重的战争之后,有�d条道路被破坏了。国王想要修复国家的道路系统,现在有两个重要城市�A和�B之间的交通中断,国王希望尽快的恢复两个城市之间的连接。你的任务就是修复一些道路使�A与�B之间的连接恢复,并要求修复的道路长度最小。

输入格式

输入文件第一行为一个整数�n(2<�≤1002<n≤100),表示城市的个数。这些城市编号从11到�n。

第二行为一个整数�m(�−1≤�≤12�(�−1)n−1≤m≤21​n(n−1)),表示道路的数目。

接下来的�m行,每行33个整数�,�,�i,j,k(1≤�,�≤�,�≠�,0<�≤1001≤i,j≤n,i=j,0<k≤100),表示城市�i与�j之间有一条长为�k的道路相连。

接下来一行为一个整数�d(1≤�≤�1≤d≤m),表示战后被破坏的道路的数目。在接下来的�d行中,每行两个整数�i和�j,表示城市�i与�j之间直接相连的道路被破坏。

最后一行为两个整数A和B,代表需要恢复交通的两个重要城市。

输出格式

输出文件仅一个整数,表示恢复�A与�B间的交通需要修复的道路总长度的最小值。

输入输出样例

输入 #1复制

3
2
1 2 1
2 3 2
1
1 2
1 3

输出 #1复制

1

 

思路:模拟题目,使用Floyd套版

#include<bits/stdc++.h>
#define INF 100000005 
using namespace std;
int G[101][101];
bool Use[101][101];
int n,m;//城市数,边数 

void  InitG(int n){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			G[i][j]=INF;
}

void  OutputG(int n){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<G[i][j]<<'\t';	
		}	
		cout<<endl; 
	}
}

int main(){
	int i,j,w=0;
	cin>>n>>m;
	//初始化 
	InitG(n);
	//OutputG(n);
	//给边赋权值
	for(int k=1;k<=m;k++){
		cin>>i>>j>>w;
		G[i][j]=G[j][i]=w; 
	}
	//OutputG(n);
	//找到已经破坏的道路 
	int bad_n=0;
	int t1,t2;
	cin>>bad_n;
	for(int i=0;i<bad_n;i++){
		cin>>t1>>t2;
		Use[t1][t2]=Use[t2][t1]=true;
	}	
	for(int i = 1;i <= n;++ i)
		for(int j = 1;j <= n;++ j)
			if(Use[i][j] == false && G[i][j] != INF)
				G[i][j] = 0;
	//OutputG(n);
	//Floyd计算多源最短路径 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				G[i][j]=min(G[i][k]+G[k][j],G[i][j]);
			}
		}
	}
	//输出
	int v1,v2;
	cin>>v1>>v2; 
	cout<<G[v1][v2]; 
	return 0;
}

没有全部通过,光想着套板子了,没好好审题,这题需要用辅助数组,将不需要修理的边权赋值为0,而不是原来的无穷大。 

看了大佬的思路才明悟:

https://www.luogu.com.cn/problem/solution/P3905

排查了半个小时,才找到这个错误:

最后的赋值也是双向的,看来测试点里还做了反向检测,太细节了!

 

#include<bits/stdc++.h>
#define INF 100000005 
using namespace std;
int G[105][105];
bool Use[105][105];
int n,m;//城市数,边数 

void  InitG(int n){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			G[i][j]=INF;
}

void  OutputG(int n){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<G[i][j]<<'\t';	
		}	
		cout<<endl; 
	}
}

int main(){
	int i,j,w=0;
	cin>>n>>m;
	//初始化 
	InitG(n);
	//OutputG(n);
	//给边赋权值
	for(int k=1;k<=m;k++){
		cin>>i>>j>>w;
		G[i][j]=G[j][i]=w; 
	}
	//OutputG(n);
	//找到已经破坏的道路 
	int bad_n=0;
	int t1,t2;
	cin>>bad_n;
	for(int i=1;i<=bad_n;i++){
		cin>>t1>>t2;
		Use[t1][t2]=Use[t2][t1]=true;
	}	
	for(int i = 1;i <= n;++ i)
		for(int j = 1;j <= n;++ j)
			if(Use[i][j] == false && G[i][j] != INF)
				G[i][j] = 0;
	//OutputG(n);
	//Floyd计算多源最短路径 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				G[j][i]=G[i][j]=min(G[i][k]+G[k][j],G[i][j]);
			}
		}
	}
	//输出
	int v1,v2;
	cin>>v1>>v2; 
	cout<<G[v1][v2]; 
	return 0;
}

 

 

...全文
397 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5

社区成员

发帖
与我相关
我的任务
社区描述
考研408:数据结构、计算机组成原理、操作系统、计算机网络
学习方法考研面试 其他
社区管理员
  • 代码骑士
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧