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

    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

    这个题多绕个弯 求最大的安全系数 并且安全系数不是相加而是相乘

    #include<cstdio>
    #include<cstring>
    #define  INF  0
    double map[1001][1001];//map[i][j]表示从i到j的安全系数 
    double  safe[1001];//safe[i]表示起点到i的安全系数 
    int vis[1001];
    int  city,anquan;
    int T,S;
    void dijkstra(int S,int T)
    {
    	int  next;//下一个接入点
    	for(int i=1;i<=city;i++)
    	{
    		  safe[i]=map[S][i];
    	 } 
    	memset(vis,0,sizeof(vis));
    	vis[S]=1;
    	for(int i=2;i<=city;i++)
    	{
    	     double maxsafe=INF;
    		for(int j=1;j<=city;j++)
    		{
    			if(vis[j]==0&&safe[j]>maxsafe)//查找下一个与起点直接相连并且安全系数高的城市 
    			{
    				maxsafe=safe[j];
    				next=j;
    			}
    		}
    	      vis[next]=1;
    		for(int j=1;j<=city;j++)
    		{
    			if(vis[j]==0&&safe[next]*map[next][j]>safe[j])//更新起点到每个点的最大安全系数 
    			{
    				safe[j]=safe[next]*map[next][j];//注意这里是乘法 
    			 } 
    		}
    	} 
    	if(safe[T]==0)
    	{
    		printf("What a pity!
    ");
    	}
    	else
    	{
    		printf("%.3lf
    ",safe[T]);
    	}
    	
    }
    int  main()
    {
    	while(scanf("%d",&city)!=EOF)
    	{
    		memset(map,0,sizeof(map));
    		 for(int i=1;i<=city;i++)
    		 {
    		 	for(int j=1;j<=city;j++)
    		 	{
    		 		scanf("%lf",&map[i][j]);
    			 }
    		 }
          int t;
          scanf("%d",&t);
             while(t--)
          {
          	scanf("%d%d",&S,&T);
          	if(S==T)
          		printf("1.000
    ");
              else
          		dijkstra(S,T);//注意这里用dijkstra();会出现运行时错误   (上面对应改为void dijkstra();)   
    	  }	
    	}
    	return 0;
    }


  • 相关阅读:
    <linux程序设计> 第四章 [ 程序参数 / 环境变量 / 日期与时间]
    阻塞分析
    架构设计分类
    软件测试
    C#中常用的加密类
    SQL2005
    用异或的性质实现简单加密解密
    在sql中取系统时间?日期?年?
    SQL Server常用到的几个设置选项
    Connection Command[ExecuteNonQuery ExecuteScalar ExecuteReader] DataReader DataAdapter DataSet
  • 原文地址:https://www.cnblogs.com/kingjordan/p/12027087.html
Copyright © 2011-2022 走看看