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

边权为1,在维护最短路的同时维护p值最小,我直接存的(1-p),即不遇见的概率,要使得这个值最大。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define eps 1e-6
#define ll long long
const int maxn=100010;
const int maxm=100010;
using namespace std;

struct node
{
    int v,w,next;
    double p;
}e[maxm<<1];
int vis[maxn],h,head[maxn],n,m,d[maxn],pre[maxn];
double p[maxn];

void addedge(int a,int b,double c)
{
    e[h].v=b;
    e[h].w=1;
    e[h].p=c;
    e[h].next=head[a];
    head[a]=h++;
}

void spfa(int s)
{
    int x,v,i;
    for(i=0;i<=n;i++)
        p[i]=0,d[i]=inf;
    memset(vis,0,sizeof vis);
    memset(pre,-1,sizeof pre);
    p[s]=1,vis[s]=1,d[s]=0;
    queue<int> q;
    q.push(s);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        vis[x]=0;
        for(i=head[x];i!=-1;i=e[i].next)
        {
            v=e[i].v;
            if(d[v]>d[x]+1)
            {
                d[v]=d[x]+1;
                p[v]=p[x]*e[i].p;
                pre[v]=x;
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
            else if(d[v]==d[x]+1)
            {
                if(p[v]<p[x]*e[i].p)
                {
                    p[v]=p[x]*e[i].p;
                    pre[v]=x;
                    if(!vis[v])
                    {
                        vis[v]=1;
                        q.push(v);
                    }
                }
            }
        }
    }
    return ;
}
int flag;
void output(int x)
{
    if(pre[x]!=-1)
        output(pre[x]);
    if(flag) flag=0;
    else putchar(' ');
    printf("%d",x);
}

int main()
{
    int a,b,s,t;
    double c;
    while(~scanf("%d%d",&n,&m))
    {
        h=0;
        memset(head,-1,sizeof head);
        scanf("%d%d",&s,&t);
        while(m--)
        {
            scanf("%d%d%lf",&a,&b,&c);
            addedge(a,b,1-c/100);
            addedge(b,a,1-c/100);
        }
        spfa(s);
        printf("%d %.8lf\n",d[t]+1,1-p[t]);
        flag=1;
        output(t);
        puts("");
    }
    return 0;
}

URAL 1934 Black Spot --- 简单最短路变形,布布扣,bubuko.com

时间: 2024-11-12 22:17:39

URAL 1934 Black Spot --- 简单最短路变形的相关文章

URAL 1934 spfa算法

D - Black Spot Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice URAL 1934 Description Bootstrap: Jones's terrible leviathan will find you and drag the Pearl back to the depths and you along with it.

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

zoj1655 最短路变形

题意:HERO过的首都需要货物,需要从其他的城市吧货物送到首都,每条道路都会需要消耗一定比例的货物,问最多能送多少货物到首都. 思路:如果每个点的比例是1,到达首都的比例就是经过的路径的(1-消耗比)的乘积,反正是无向的,所以可以反过来推,首都的货物比是1,而到达每座 城市的货物就是所经过的路径(1-消耗比)的乘积,则由此可见,我们可以求首都到任意城市的最大比值:最后把每个点的最大比值乘以每个点的货物加起来 即是结果. #include<stdio.h> #include<string.

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

hdu2112(HDU Today 简单最短路)

Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了.这样住了一段时间,徐总对当地的交通还是不太了解.有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格).徐总经常会问蹩脚的英文问路:“Can

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%的能量,一次类推,最后一行输入起始位置,重点位置,开始时的能量,问从起点走到终点,消耗的能量最少. 思路:很明显的最短路变形,我们可以将求出从起点到终点剩余的最多的能量,用总能量减去它,就是消耗的最少的能量,这就好办了,将最短路改成最长路即可,但是每次比较时就是比较乘积而不是