1 条题解
-
0
解题思路:
- 首先需要计算出所有地点之间的最短路径。因为给定的距离矩阵可能存在不连通的情况(距离为(-1)),且关系不对称,所以可以使用弗洛伊德算法(Floyd - Warshall Algorithm)来计算任意两点之间的最短路径。
- 计算出所有不同地点对的数量,根据给定的成功概率p,确定满足成功概率所需的最短路径数量。
- 遍历所有地点对的最短路径,从小到大排序,找到满足成功概率要求的最小距离。
实现步骤
- 读取输入:读取测试用例数量、成功概率p、地点数量n以及距离矩阵。
- 计算最短路径:使用弗洛伊德算法计算所有地点之间的最短路径,更新距离矩阵。
- 统计满足概率的最短路径:生成所有不同地点对,计算每个地点对的最短路径,将其按从小到大排序,根据成功概率p确定最小距离。
- 输出结果:按照输出格式要求,输出每个测试用例的结果。 代码:
#include<iostream> #include<algorithm> #include<cmath> #include <cstring> using namespace std; int g[101][101]; int d[101]; int min(int a,int b) { return a<b?a:b; } int main() { int i,j,k,n,p,cnt,test; cin>>test; for(cnt=1;cnt<=test;cnt++) { memset(g,0,sizeof(g)); memset(d,0,sizeof(d)); cin>>p; cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { cin>>g[i][j]; } for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(g[i][k]>=0&&g[k][j]>=0) { if(g[i][j]==-1) g[i][j]=g[i][k]+g[k][j]; else g[i][j]=min(g[i][j],g[i][k]+g[k][j]); } } k=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(g[i][j]>0) { d[k++]=g[i][j]; } } sort(d,d+k); i=n*(n-1)*p; i=i/100+(i%100!=0); //i=ceil(n*(n-1)*p/100.0); printf("Scenario #%d:\n",cnt); printf("%d\n\n",d[int(i)-1]); } return 0; }
- 1
信息
- ID
- 1497
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者