题意:不同城市之间一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条从u 到 v 的通道P 的安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在8600 想出去旅游,面对这这么多的路,他想找一条最安全的路。
思路:寻找最为安全的道路,即安全系数乘积的最大值,使用spfa算法。
感想:还是要多尝 去试不同的算法解题,找到最好的方法。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int n,m,s,e,front,rear;
double map[1005][1005],dis[1005];
int v[1005],q[1000001];
void spfa(){
int p;
while(front<rear){
p=q[front++];
v[p]=0;
for(int i=0;i<n;i++){
if(map[p][i]==0||p==i)
continue;
if(dis[p]*map[p][i]>dis[i]){
dis[i]=dis[p]*map[p][i];
if(!v[i]){
q[rear++]=i;
v[i]=1;
}
}
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%lf",&map[i][j]);
scanf("%d",&m);
while(m--){
scanf("%d%d",&s,&e);
memset(v,0,sizeof(v));
memset(dis,0,sizeof(dis));
v[s-1]=dis[s-1]=1;
front=0;
rear=1;
q[front]=s-1;
spfa();
if(dis[e-1]!=0)
printf("%.3lf\n",dis[e-1]);
else
printf("What apity!\n");
}
}
return 0;
}