zoj1655 最短路变形

题意:HERO过的首都需要货物,需要从其他的城市吧货物送到首都,每条道路都会需要消耗一定比例的货物,问最多能送多少货物到首都。

思路:如果每个点的比例是1,到达首都的比例就是经过的路径的(1-消耗比)的乘积,反正是无向的,所以可以反过来推,首都的货物比是1,而到达每座

城市的货物就是所经过的路径(1-消耗比)的乘积,则由此可见,我们可以求首都到任意城市的最大比值;最后把每个点的最大比值乘以每个点的货物加起来

即是结果。

#include<stdio.h>
#include<string.h>
const int maxn = 150;
const double lep = 1e-8;
double map[maxn][maxn];
int vis[maxn];
double dis[maxn];
int w[maxn];
int n,m;

void init()
{
    memset(vis,0,sizeof(vis));
    memset(dis,0,sizeof(dis));
    for(int i=0;i<=n;i++)
    {
        for(int j =0;j<=n;j++)
            map[i][j] = -1;
    }
}
double  DIJ() // 求每座城市送物资的最大比值;
{
    int i,j;
    int u = n;
    dis[u] = 1;
    vis[u] = 1;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<n;j++)
        {
            if(!vis[j] && dis[j] < dis[u] * map[u][j])
            {
                dis[j] = dis[u] * map[u][j];
            }
        }
        double max  = 0;
        for(j=1;j<n;j++)
        {
            if(!vis[j] && dis[j] - max > lep)
            {
                max = dis[j];
                u = j;
            }
        }
        vis[u] =1;
    }
    double ans = 0;
    for(i= 1; i<n;i++)
        ans += w[i] * dis[i];
    return ans;
}
int main()
{
    int i;
    while(~scanf("%d%d",&n,&m))
    {
        init();
        for(i=1;i<n;i++)
            scanf("%d",&w[i]);
        w[n]= 0;
        for(i=0;i<m;i++)
        {
            int a,b;
            double c;
            scanf("%d%d%lf",&a,&b,&c);
            if(map[a][b] < (1 - c) )
            {
                map[a][b] = map[b][a] = 1-c;
        //        printf("%lf\n",map[a][b]);
            }
        }
        printf("%.2lf\n",DIJ());
    }
    return 0;
}

/*
5 6
10
10
10
10
1 3 0
1 4 0
2 3 0
2 4 0
3 5 0
4 5 0

*/

zoj1655 最短路变形

时间: 2024-10-14 15:09:28

zoj1655 最短路变形的相关文章

URAL 1934 Black Spot --- 简单最短路变形

边权为1,在维护最短路的同时维护p值最小,我直接存的(1-p),即不遇见的概率,要使得这个值最大. #include <iostream> #include <cstdlib> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #includ

UESTC 915 方老师的分身II --最短路变形

即求从起点到终点至少走K条路的最短路径. 用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大于K条边的当做K条边来处理就好了.求最短路的三个算法都可以做,我这里用的是SPFA,比较简洁. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #incl

zoj 1655 Transport Goods (最短路变形)

Transport Goods Time Limit: 2 Seconds      Memory Limit: 65536 KB The HERO country is attacked by other country. The intruder is attacking the capital so other cities must send supports to the capital. There are some roads between the cities and the

HN0I2000最优乘车 (最短路变形)

HN0I2000最优乘车 (最短路变形) [试题]为了简化城市公共汽车收费系统,某城市决定对大部分的公共汽车都采用一票制,但由于某些公共汽车所经过的停车站太多和路途太长,就采用两票或多票制.经过这种票制改革后,人们坐公共汽车从一个站到另一个站时,就不得不选择一个好的乘车方案,以使他们的乘车费用最低. 为了方便于求出最佳的乘车方案,我们假设: l  采用一票制的公共汽车,无论从哪个站上车到那个站下车,乘该公共汽车的费用为1(费用单位). l  采用多票制的公共汽车,将设立某些站为关键站:那么,如果

POJ 1797 Heavy Transportation (最短路变形)

Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 20364   Accepted: 5401 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man

HDOJ find the safest road 1596【最短路变形】

find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9033    Accepted Submission(s): 3173 Problem Description XX星球有非常多城市,每一个城市之间有一条或多条飞行通道,可是并非全部的路都是非常安全的,每一条路有一个安全系数s,s是在 0 和

HDU 4318 图论之最短路变形

点击打开链接 题意:看样例说把,一共4个点,接下来输入一个数,代表当前点连接的点的数量,然后那几个点,样例里面就是1->2消耗50%的能量,1->3消耗70%的能量,2->1消耗30%的能量,2->4消耗20%的能量,一次类推,最后一行输入起始位置,重点位置,开始时的能量,问从起点走到终点,消耗的能量最少. 思路:很明显的最短路变形,我们可以将求出从起点到终点剩余的最多的能量,用总能量减去它,就是消耗的最少的能量,这就好办了,将最短路改成最长路即可,但是每次比较时就是比较乘积而不是

UVA - 10537 The Toll! Revisited (最短路变形逆推)

Description Problem G Toll! Revisited Input: Standard Input Output: Standard Output Time Limit: 1 Second Sindbad the Sailor sold 66 silver spoons to the Sultan of Samarkand. The selling was quite easy; but delivering was complicated. The items were t

POJ2253&amp;ZOJ1942--Frogger【SPFA】单源最短路变形

链接:http://poj.org/problem?id=2253 题意:一个青蛙在一块石头上,看到了另一个青蛙在另一块石头上,它想跳过去找它,如果距离太远它就需要借助别的石头当跳板,两块石头之间的青蛙距离被定义成两块石头之间所有路径中最大跳跃距离的最小值,求两个青蛙之间的青蛙距离. poj2263和它类似,链接:http://poj.org/problem?id=2263 解题报告:Here 这是最短路的变形,每两点之间都有路可以跳,更新最短路的值,权值记录成目前到这一点的最小青蛙距离就行了