zoukankan      html  css  js  c++  java
  • HDOJ--1596--find the safest road

    find the safest road

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 9438    Accepted Submission(s): 3338


    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到2再到3那么3的安全系数就是1的安全系数*2的安全系数。

    思路:还是最短路,仅仅只是稍微变化了一些。

    不再是权值相加而是相乘。

    ac代码:
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #define INF 0x3f3f3f3f
    #define M 1001*1001
    #define N 1001
    using namespace std;
    int vis[N],head[N],n,m,edgenum;
    double dis[N];
    struct node{
    	int from,to;
    	double cost;
    	int next;
    }edge[M];
    void init(){
    	edgenum=0;
    	memset(head,-1,sizeof(head));
    }
    void add(int u,int v,double w){
    	node E={u,v,w,head[u]};
    	edge[edgenum]=E;
    	head[u]=edgenum++;	
    }
    void spfa(int beg){
    	queue<int>q;
    	int i;
    	for(i=1;i<=1000;i++)//由于求的是概率最大的所以初始化为0; 
    		dis[i]=0;
    	memset(vis,0,sizeof(vis));
    	dis[beg]=1;//自己到自身的安全系数是1。 
    	vis[beg]=1;
    	q.push(beg);
    	while(!q.empty()){
    		int u=q.front();
    		q.pop();
    		vis[u]=0;
    		for(i=head[u];i!=-1;i=edge[i].next){
    			int v=edge[i].to;
    			if(dis[v]<dis[u]*edge[i].cost){//题意要求是求安全系数最大的。满足条件就更新。 
    				dis[v]=dis[u]*edge[i].cost;
    				if(!vis[v]){
    					vis[v]=1;
    					q.push(v);
    				}
    			}
    		}
    	}
    }
    int main(){
    	while(scanf("%d",&n)!=EOF){
    		init();
    		int i,j;
    		for(i=1;i<=n;i++)
    			for(j=1;j<=n;j++){
    				double cost;
    				scanf("%lf",&cost);
    				if(cost==0)
    					continue;
    				add(i,j,cost);
    			}
    			int num;
    		scanf("%d",&num);
    		while(num--){
    			int a,b;
    			scanf("%d%d",&a,&b);
    			spfa(a);
    			if(dis[b]==0)
    				printf("What a pity!
    ");
    			else
    				printf("%.3lf
    ",dis[b]);
    		}
    	}
    	return 0;
    }



  • 相关阅读:
    PDF文件中的Form保存问题
    Understanding IP Fragmentation
    tcp ip guide IPsec IKE
    Windows安全事件日志中的事件编号与描述
    Cisco PIX fix up and Juniper firewall FTP ALG
    很好的IPSec介绍,详细解释了IKE协商的2个阶段的作用
    virtualbox 下运行Ubuntu 8.10的分辨率和guest additions的问题。
    Fixing the ‘Do you want to display nonsecure items’ message
    windows xp 开始菜单里面所有项目右键不起作用。
    HP backup and recovery manager
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7218305.html
Copyright © 2011-2022 走看看