find the safest road
Time Limit : 10000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 23 Accepted Submission(s) : 12
Problem Description
XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条从u 到 v 的通道P 的安全度为Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在8600 想出去旅游,面对这这么多的路,他想找一条最安全的路。但是8600 的数学不好,想请你帮忙 ^_^
Input
输入包括多个测试实例,每个实例包括:第一行:n。n表示城市的个数n<=1000; 接着是一个n*n的矩阵表示两个城市之间的安全系数,(0可以理解为那两个城市之间没有直接的通道) 接着是Q个8600要旅游的路线,每行有两个数字,表示8600所在的城市和要去的城市
Output
如果86无法达到他的目的地,输出"What a pity!", 其他的输出这两个城市之间的最安全道路的安全系数,保留三位小数。
Sample Input
3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3
Sample Output
0.500 0.400 0.500
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #define MAX(x,y)(x>y?x:y) 4 const int MAXN=1010; 5 double map[MAXN][MAXN],d[MAXN]; 6 int vis[MAXN]; 7 int n; 8 void initial(){ 9 memset(d,0,sizeof(d)); 10 memset(vis,0,sizeof(vis)); 11 } 12 void dijskra(int s){ 13 initial();//写错位置了,应该每次都初始化 14 d[s]=1; 15 while(true){ 16 int k=-1; 17 for(int i=1;i<=n;i++) 18 if(!vis[i]&&(k==-1||d[i]>d[k]))k=i; 19 if(k==-1)break; 20 vis[k]=1; 21 for(int i=1;i<=n;i++) 22 d[i]=MAX(d[i],d[k]*map[k][i]); 23 } 24 } 25 int main(){int Q,a,b; 26 while(~scanf("%d",&n)){ 27 memset(map,0,sizeof(map)); 28 for(int i=1;i<=n;i++) 29 for(int j=1;j<=n;j++) 30 scanf("%lf",&map[i][j]); 31 scanf("%d",&Q); 32 while(Q--){ 33 scanf("%d%d",&a,&b); 34 dijskra(a); 35 if(d[b]==0.0)puts("What a pity!"); 36 else printf("%.3lf\n",d[b]); 37 } 38 } 39 return 0; 40 }
SPFA:
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 using namespace std; 5 const int MAXN=1010; 6 const int MAXM=2000010; 7 int head[MAXM],vis[MAXN]; 8 double dis[MAXN]; 9 struct Edge{ 10 int from,to,next; 11 double value; 12 }; 13 Edge edg[MAXM]; 14 int n,edgnum; 15 queue<int>dl; 16 void initial(){ 17 memset(dis,0,sizeof(dis)); 18 memset(vis,0,sizeof(vis)); 19 while(!dl.empty())dl.pop(); 20 } 21 void add(int u,int v,double value){ 22 Edge E; 23 E.from=u;E.to=v;E.value=value;E.next=head[u]; 24 edg[edgnum]=E; 25 head[u]=edgnum++; 26 } 27 void SPFA(int sx){ 28 initial(); 29 dis[sx]=1; 30 vis[sx]=1; 31 dl.push(sx); 32 while(!dl.empty()){ 33 int k=dl.front(); 34 dl.pop(); 35 vis[k]=0; 36 for(int i=head[k];i!=-1;i=edg[i].next){ 37 int v=edg[i].to; 38 if(dis[k]*edg[i].value>dis[v]){ 39 dis[v]=dis[k]*edg[i].value; 40 if(!vis[v]) 41 dl.push(v),vis[v]=1; 42 } 43 } 44 } 45 } 46 int main(){ 47 int a,b,Q; 48 double v; 49 while(~scanf("%d",&n)){ 50 memset(head,-1,sizeof(head)); 51 edgnum=0; 52 for(int i=1;i<=n;i++) 53 for(int j=1;j<=n;j++){ 54 scanf("%lf",&v); 55 add(i,j,v); 56 } 57 scanf("%d",&Q); 58 while(Q--){ 59 scanf("%d%d",&a,&b); 60 SPFA(a); 61 if(dis[b]==0.0)puts("What a pity!"); 62 else printf("%.3lf\n",dis[b]); 63 } 64 } 65 return 0; 66 }