zoukankan      html  css  js  c++  java
  • Lightoj 1321 Sending Packets(Bellman-Ford)

    题意

    给定一个无向图,边的权值为小于1的小数,表示通过这条边的数据成功传输到另一边的可能性,0.8表示有百分之八十的可能性传输过去。问你从起点到终点,最大的传输成功率多大。

    分析

    根据题意,相当于求一个最长路,dijkstra有点难写,直接用bellman-ford,因为边权值都是小于1的,所以更新操作用的乘法永远是越来越小的,我们刚好要最大的。所以比较方便就能处理出来,然后得出最大的传输成功率以后结合题意中的其他要求进行简单的运算就能得出答案了。

    代码

    #define rep(x,y,z) for(int x=y;x<z;x++)
    #define drep(x,y,z) for(int x=y;x>=z;x--)
    #define pb(x) push_back(x)
    #define mp(x,y) make_pair(x,y)
    #define clr(x,y) memset(x,y,sizeof(x))
    #define fi first
    #define se second
    
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <vector>
    #include <queue>
    using namespace std;
    
    const int N = 110;
    
    vector<pair<pair<int,int>,double> > edge;
    double val[N];
    double dp[N][N];
    
    void init(){
        edge.clear();
        clr(val,0);
        clr(dp,0);
    }
    
    void read(int m){
        rep(i,0,m){
            int u , v , w;
            scanf("%d %d %d",&u,&v,&w);
            edge.pb(mp(mp(u,v),double(w)/100.0));
            edge.pb(mp(mp(v,u),double(w)/100.0));
        }
    }
    
    double slove(int n){
        val[0] = 1;
        int size = edge.size();
        while(1){
            bool ok = 0;
            rep(i,0,size){
                int u = edge[i].fi.fi;
                int v = edge[i].fi.se;
                double w = edge[i].se;
    
                if(val[u] * w > val[v]){
                    ok = 1;
                    val[v] = val[u] * w;
    
                }
            }
            if(!ok) break;
        }
        return val[n - 1];
    }
    
    int main(){
        int t;
        scanf("%d",&t);
        rep(tt,1,t+1){
            int n , m , s , k;
            scanf("%d %d %d %d",&n,&m,&s,&k);
            init();
            read(m);
            double ans = slove(n);
            //
            ans = (k / ans) * 2 * s;
            //
            printf("Case %d: %lf
    ",tt,ans);
        }
    
    
        return 0;
    }
  • 相关阅读:
    走向变态的人生
    HDWIKI 4.0.2绿色版(含运行环境)(V1)
    centos7 安装python3.7.1
    一种高并发流控程序的简单轻量实现
    编写JDBC框架优化CRUD操作
    一段阻塞队列代码的纠错与优化
    一次请求在同一个事务实现
    创建Java内部类的编译错误处理
    C++模板简单分析与举例
    java.lang.OutOfMemoryError处理错误
  • 原文地址:https://www.cnblogs.com/ticsmtc/p/6107225.html
Copyright © 2011-2022 走看看