• hdu 4318 Power transmission 夜


    http://acm.hdu.edu.cn/showproblem.php?pid=4318

    很裸的spfa

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include<queue>
    #include<cmath>
    #define LL long long
    
    using namespace std;
    
    const int N=50040;
    const double M=200000000.0;
    struct node
    {
        struct tt *next;
    }mem[N];
    struct tt
    {
        struct tt *next;
        int j;
        int k;
    };
    void build(int i,int j,int k)
    {
        struct tt *t=new tt;
        t->j=j;
        t->k=k;
        t->next=mem[i].next;
        mem[i].next=t;
    }
    void Dele(int n)
    {
        for(int i=1;i<=n;++i)
        {
            mem[i].next=NULL;
        }
    }
    int n;
    double dist[N];
    void  spfa(int st,int nd,double power)
    {
        for(int i=1;i<=n;++i)
        {
            if(i==st)
            dist[i]=power;
            else
            dist[i]=-1.0;
        }
        bool in[N];
        memset(in,false,sizeof(in));
        queue<int>str;
        in[st]=true;
        str.push(st);
        struct tt *t;
        while(!str.empty())
        {
            int x=str.front();
            in[x]=false;
            str.pop();
            t=mem[x].next;
            while(t!=NULL)
            {
                if(dist[x]*(t->k)/100.0>dist[t->j])
                {
                    dist[t->j]=dist[x]*(t->k)/100.0;
                    if(!in[t->j])
                    {
                        in[t->j]=true;
                        str.push(t->j);
                    }
                }
                t=t->next;
            }
        }
    }
    int main()
    {
        //freopen("data.txt","r",stdin);
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=1;i<=n;++i)
            {
                int j,k,w;
                scanf("%d",&w);
                while(w--)
                {
                    scanf("%d %d",&j,&k);
                    build(i,j,100-k);
                }
            }
            int st,nd;
            double power;
            scanf("%d %d %lf",&st,&nd,&power);
            if(st==nd)
            {
                printf("0.00\n");
                continue;
            }
            spfa(st,nd,power);
            if(dist[nd]<0.0)
            printf("IMPOSSIBLE!\n");
            else
            {
                printf("%.2lf\n",power-dist[nd]);
            }
            Dele(n);
        }
        return 0;
    }
    

      

  • 相关阅读:
    第一次的作业
    第02组 Alpha冲刺(2/4)
    团队项目选题报告
    第一次个人编程作业
    第二次结对编程作业
    胖子的故事(四)
    关于博客园的聚合问题
    blog是写给谁看的
    ASP.NET Forms 身份验证
    要努力了!
  • 原文地址:https://www.cnblogs.com/liulangye/p/2612731.html
Copyright © 2020-2023  润新知