結果
| 問題 | No.298 話の伝達 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2016-02-17 23:00:25 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 976 ms / 5,000 ms | 
| コード長 | 1,278 bytes | 
| コンパイル時間 | 1,405 ms | 
| コンパイル使用メモリ | 167,068 KB | 
| 実行使用メモリ | 19,868 KB | 
| 最終ジャッジ日時 | 2024-09-22 07:43:23 | 
| 合計ジャッジ時間 | 4,878 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 21 | 
ソースコード
#include "bits/stdc++.h"
#include<unordered_map>
#pragma warning(disable:4996)
using namespace std;
using ld = long double;
template<class T>
using Table = vector<vector<T>>;
int main() {
	int N, M; cin >> N >> M;
	vector<vector<pair<int, ld>>>edges(N),revedges(N);
	for (int i = 0; i < M; ++i){
		int a, b;ld c; cin >> a >> b >> c;
		c /= 100;
		edges[a].push_back(make_pair(b, c));
		revedges[b].push_back(make_pair(a, c));
	}
	vector<ld>pers(1 << N);
	for (int talk = 0; talk < (1 << N); ++talk){
		bitset<20>bs(talk);
		ld per = 1;
		for (int i = 0; i < N; ++i){
			ld misper = 1;
			bool ok = false;
			if (i == 0){
				if (bs[0]){
					ok = true;
					per *= 1;
				}
				else{
					ok = false;
					per *= 0;
				}
			}else if (bs[i]){
				for (auto e : revedges[i]){
					if (bs[e.first]){
						ok = true;
						misper *= 1 - e.second;
					}
				}
				per *= (1 - misper);
			}
			else{
				for (auto e : revedges[i]){
					if (bs[e.first]){
						misper *= 1-e.second;
					}
				}
				per *= misper;
			}
		}
		pers[talk] =per;
	}
	ld total = 0;
	ld ok = 0;
	for (int talk = 0; talk < (1 << N); ++talk){
		bitset<20>bs(talk);
		if (bs[0]){
			total += pers[talk];
			if (bs[N - 1])ok += pers[talk];
		}
	}
	cout << setprecision(22)<<ok/total << endl;
	return 0;
}
            
            
            
        