美文网首页
Uva(11600)(Masud Rana )

Uva(11600)(Masud Rana )

作者: kimoyami | 来源:发表于2018-08-30 12:14 被阅读5次

链接:https://vjudge.net/problem/UVA-11600
思路:主要是状态的考虑,因为每两个点都有路,所以只用区分有没有怪兽即可,我们可以算从一个点开始走到全部两两连通的时候的概率,这时候我们需要用一个数来表示当前已经两两连通的点的集合,状态转移就是枚举不在集合中的点,dp[u][s] += DP(i,(s|(1<<i)) * num[i] / (n-have) ,表示选一个没在集合中的点的期望的总和,由于期望是概率的倒数,所以一开始我们计算的时候就可以入上倒过来计算,需要预处理一下原图,将各个已经连通块的数目统计出来即可。
代码:

#include<bits/stdc++.h>
using namespace std;

int t,n,m;
const int maxn = 105;
const int maxm = maxn*maxn;
map<int,double> dp[maxn];
vector<int> G[maxn];
int vis[maxn];
int num[maxn];
int _num;

int dfs(int u){
    vis[u] = 1;
   int ans = 1;
    for(int i=0;i<G[u].size();i++){
        if(!vis[G[u][i]])ans+=dfs(G[u][i]);
    }
    return ans;
}

double DP(int u,int s){
    if(dp[u].count(s))return dp[u][s];
    int have = 0,i;
    for(i=0;i<_num;i++){
        if(s&(1<<i))have+=num[i];
    }
    if(have==n)return dp[u][s] = 0;
    dp[u][s] = (n-1)*1.0/(n-have);
    for(int i=0;i<_num;i++){
        if(s&(1<<i))continue;
        dp[u][s] += DP(i,s|(1<<i))*num[i]/(n-have);
    }
    return dp[u][s];
}

int main(){
    scanf("%d",&t);
    int kase = 0;
    while(t--){
        memset(num,0,sizeof(num));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<=n;i++){
            G[i].clear();
        dp[i].clear();
        }
        _num = 0;
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            G[a].push_back(b);
            G[b].push_back(a);
        }
       for(int i=1;i<=n;i++){
           if(!vis[i]){
               num[_num++] = dfs(i);
           }
       }
       printf("Case %d %.6lf\n",++kase,DP(0,1));
    }
    return 0;
}

相关文章

  • Uva(11600)(Masud Rana )

    链接:https://vjudge.net/problem/UVA-11600思路:主要是状态的考虑,因为每两个点...

  • 素数练习题

    UVA 10375 UVA 10791 UVA10375 Choose and divide 题解 先素数打表,然...

  • 有趣的数学题

    UVA12716 UVA11582 UVA12716 GCD XOR 题解 参考这题用到2个结论a ^ b = c...

  • 字典树

    UVA 11488题目链接https://uva.onlinejudge.org/index.php?option...

  • ACM 国内外几个网站 & 题目分类

    国外 西班牙Valladolid大学 Uva:https://uva.onlinejudge.org俄罗斯Ural...

  • 皮肤科学小知识:

    对皮肤造成损伤的紫外线主要是UVB和UVA。 UVA能穿透玻璃对皮肤的穿透能力也比较强,可以深达真皮,UVA的生物...

  • ACM刷题打卡-151215

    UVa 272 - TEX Quotes 水题。字符替换。 UVa 10082 - WERTYU 第一次提交WA,...

  • 美肤mini课堂之防晒的理论知识

    1、关于UVA和UVB UVB是波短的紫外线,威力次于UVA,只能晒到表皮层,能把皮肤晒红、晒伤;UVA是波长的紫...

  • 2020-08-22

    达到精准美白的目的,防UVA更重要,之前一直有说法,UVA与老化的关系更直接。毕竟UVA的辐射量是UVB的近50倍...

  • 可连接不同探头的UVA紫外辐射照度计

    目前林上的紫外辐射照度计LS125,一个主机可连接9款不同的探头,UVA波段的有五款,分别是UVA、UVA-X1、...

网友评论

      本文标题:Uva(11600)(Masud Rana )

      本文链接:https://www.haomeiwen.com/subject/ovprwftx.html