【图的存储】新建公路
题目描述
一个国家有n个城市编号为1至n,被已有的m条高速公路连接,每条高速公路有一个长度len。现在政府决定建造新的高速公路,有q项提议,每项提议计划在x,y城市间建造一条新的长度为z高速公路。当然有些提议可能不会让两个城市间公路的情况变得更好,那么这项提议将会取消,反之则会通过
输入格式
第一行三个整数n,m,q
接下来m行,每行三个整数x,y,len,表示已有的高速公路
接下来q行,每行三个整数x,y,z,表示一项提议
输出格式
对于每个x,y如果通过输出Accepted,否则输出Cancel
样例 #1
样例输入 #1
5 5 2
1 2 3
2 3 4
3 4 5
4 5 6
5 1 7
1 2 2
5 1 8
样例输出 #1
Accepted
Cancel
提示
0
<
n
,
m
<
=
100
,
q
<
=
n
∗
(
n
−
1
)
,
1
<
=
x
,
y
<
=
n
,
0
<
l
e
n
,
z
<
=
100
0<n,m<=100,q<=n*(n-1),1<=x,y<=n,0<len,z<=100
0<n,m<=100,q<=n∗(n−1),1<=x,y<=n,0<len,z<=100
20
%
的数据存在重边
20\%的数据存在重边
20%的数据存在重边
——————————————————————————————————————————————
思路如下
判断与原路径的大小,比原来小的话,就修建
代码如下
/*
-----------fjn-----------
*/
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define F (100000007)
#define MAXN (100+5)
typedef long long ll;
int arr[104][104];
int main(){
int n,m,q;
cin>>n>>m>>q;
int a,b,c,x,y,z;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
arr[i][j]=F;
}
}
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
arr[a][b]=min(arr[a][b],c);
arr[b][a]=min(arr[b][a],c);
}
// for(int k=1;k<=n;k++){
// for(int i=1;i<=n;i++){
// for(int j=i+1;j<=n;j++){
// arr[i][j]=min(arr[i][j],arr[i][k]+arr[k][j]);
// arr[j][i]=arr[i][j];
// }
// }
// }
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
// if(arr[i][j]==F)cout<<"**"<<" ";
// else cout<<arr[i][j]<<" ";
// }
// cout<<endl;
// }
for(int i=1;i<=q;i++){
cin>>x>>y>>z;
if(arr[x][y]<=z){
cout<<"Cancel"<<endl;
}
else cout<<"Accepted"<<endl;
}
return 0;
}