• [dijkstra][HAOI2009][jzyzoj1507]旅行


      第一次用堆优化的模板居然A了,下面给出题面

      

      如果用邻接矩阵的话,原数据空间复杂度为10^8,好像会MLE?所以我选择改用堆优化的dijkstra

      这里是需要注意的几点:

        1.求最短路时的路径长应该是两条路径长度相乘除以一百(我的方法是直接将路径长转化为小数,最终输出时将答案乘100);

        2.因为要求的是最大可能性,所以建立堆时应当用大根堆;

        3.从i到i的几率应该为1,记录最短路的数组初始化的时候应该全部设为0。

      剩下的就是标准的dijkstra模板了,代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<utility>
    using namespace std;
    typedef pair<double,int>    pii;
    struct edge{
        int y,ne;
        double v;
    }edge[60010];
    int n,m,head[10010],len=0;
    bool vis[10010];
    double d[10010];
    void addedge(int x,int y,int v)
    {
        edge[++len].y=y;
        edge[len].v=double(v)/100;
        edge[len].ne=head[x];
        head[x]=len;
    }
    
    void init()
    {
        memset(head,-1,sizeof(head));
        scanf("%d%d",&n,&m);
        int x,y,v;
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&v);
            addedge(x,y,v);
            addedge(y,x,v);
        }
    }
    
    void dijkstra(int s)
    {
        priority_queue<pii>    q;
        for (int i=1;i<=n;i++)//初始化
            d[i]=0;
        d[s]=1;
        memset(vis,false,sizeof(vis));
        q.push(make_pair(d[s],s));
        while (!q.empty())
        {
            pii temp=q.top();
            q.pop();
            int x=temp.second;
            if (vis[x])    continue;
            vis[x]=true;
            for (int i=head[x];i!=-1;i=edge[i].ne)
                if (d[edge[i].y]<d[x]*edge[i].v)
                {
                    d[edge[i].y]=d[x]*edge[i].v;
                    q.push(make_pair(d[edge[i].y],edge[i].y));
                }
        }
        printf("%.6lf
    ",d[n]*100);
    }
    
    int main()
    {
        //freopen("add.in","r",stdin);
        //freopen("add.out","w",stdout);
        init();
        dijkstra(1);//只需要求出1到其他各点的最短路即可
        return 0;
    }
    AC代码

      

  • 相关阅读:
    Unity错误-(Android build error) Can not sign application Unable to sign application; please provide passwords!
    C#WCF中传输List对象
    抓包工具Omnipeek,Wireshark
    Ubuntu18+.netcore+Nginx+Supervisor部署ASP.NET项目
    3D成像技术
    3D显示技术
    学习模电与数电
    【Java123】解决PKIX path building failed / unable to find valid certification path to requested target
    【Python123】Introduction
    【WebConsole123】练习案例之浏览器访问服务器shell
  • 原文地址:https://www.cnblogs.com/hinanawitenshi/p/6553298.html
Copyright © 2020-2023  润新知