• hoj 2012 winter training Graph Day1 106 miles to Chicago图论最短路dijkstra算法


    题目:
    给出两个顶点并且给出两个顶点之间的概率,求从1到n的最大的概率
    分析:
    纯粹是dijkstra算法,只不过把最短路径改动一下而已
    要先定义dp[n]=1;后面的直接套用dijkstra模板,把min部分改为max即可,
    并且之前加的部分改为相乘即可

    dijkstra模板:
    设图由邻接矩阵g存储。
    memset(dist,0x3f,sizeof(dist));
    memset(used,false,sizeof(used));
    dist[0]=0;//设0为源点
    for(i=0;i<n;i++)//循环n次
    {
    min=10000000;
    for(j=0;j<n;j++)//找到最小值
    if(!used[j]&&dist[j]<min)
    {
    min=dist[j];
    k=j;
    }
    used[k]=true;
    for(j=0;j<n;j++)//更新其它点
    dist[j]=min(dist[j],dist[k]+g[k][j]);
    }

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    #define X 101
    double map[X][X];
    double dp[X];
    bool use[X];
    double Max(double a,double b)
    {
    return a>b?a:b;
    }
    int main()
    {
    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    int n,m;
    while(cin>>n,n)
    {
    cin>>m;
    int a,b;
    double p;
    memset(map,0,sizeof(map));
    memset(dp,0,sizeof(dp));
    memset(use,false,sizeof(use));
    for(int i=1;i<=m;i++)
    { //把对应的两顶点之间的概率付给对应的顶点,
    cin>>a>>b>>p;
    map[a][b] = p/100; //因为是无向图,两边都得赋值
    map[b][a] = p/100;
    }
    double sum = 1;
    dp[1] = 1;
    int k;
    for(int i=1;i<=n;i++)
    { //dijkstra模板
    double maxx = 0;
    for(int j=1;j<=n;j++)
    if(!use[j]&&maxx<dp[j])
    {
    maxx = dp[j];
    k = j;
    }
    use[k] = true;
    for(int j=1;j<=n;j++)
    dp[j] = Max(dp[j],dp[k]*map[k][j]);
    }
    dp[n]*=100;
    printf("%lf percent\n",dp[n]);
    }
    return 0;
    }

  • 相关阅读:
    python selenium启动配置
    pyqt5安装 + pycharm配置
    Python redis 存取使用
    pycharm 打不开 解决办法
    Python 将图片上传至阿里云OSS对象存储
    mysql表中已有数据,为表新增一个自增id。
    Python 使用BrowserMob Proxy + Selenium 获取Ajax加密数据
    Pycharm 2020.01亲测激活到2089年
    Python3 执行JS出现JSON未定义问题
    pycharm激活,此方法为永久激活。
  • 原文地址:https://www.cnblogs.com/yejinru/p/2374722.html
Copyright © 2020-2023  润新知