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

来源:互联网 发布:淘宝哪家店女装好看又便宜 编辑:程序博客网 时间:2024/05/18 00:35

边权为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 longconst 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;}


0 0