zoukankan      html  css  js  c++  java
  • [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代码

      

  • 相关阅读:
    Ping 笔记
    android之RadioGroup
    Android之activity中新建控件
    案例:TableLayout表格布局——迷你计算器
    android中5大布局
    Android体系结构及activity生命周期
    Android之ADB指令
    Android之activity初讲
    简单介绍Android应用特色及详解四大组件
    开发Android应用怎么更改LOGO图标
  • 原文地址:https://www.cnblogs.com/hinanawitenshi/p/6553298.html
Copyright © 2011-2022 走看看