5
社区成员
发帖
与我相关
我的任务
分享从前,在一个王国中,在�n个城市间有�m条道路连接,而且任意两个城市之间至多有一条道路直接相连。在经过一次严重的战争之后,有�d条道路被破坏了。国王想要修复国家的道路系统,现在有两个重要城市�A和�B之间的交通中断,国王希望尽快的恢复两个城市之间的连接。你的任务就是修复一些道路使�A与�B之间的连接恢复,并要求修复的道路长度最小。
输入文件第一行为一个整数�n(2<�≤1002<n≤100),表示城市的个数。这些城市编号从11到�n。
第二行为一个整数�m(�−1≤�≤12�(�−1)n−1≤m≤21n(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;
}