結果
| 問題 | No.298 話の伝達 | 
| コンテスト | |
| ユーザー |  startcpp | 
| 提出日時 | 2015-11-06 23:30:52 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                WA
                                 
                            (最新) 
                                AC
                                 
                            (最初) | 
| 実行時間 | - | 
| コード長 | 1,162 bytes | 
| コンパイル時間 | 610 ms | 
| コンパイル使用メモリ | 72,044 KB | 
| 実行使用メモリ | 6,948 KB | 
| 最終ジャッジ日時 | 2024-09-13 13:49:56 | 
| 合計ジャッジ時間 | 1,454 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 10 WA * 11 | 
ソースコード
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
double getProOr( vector<double> a ){
	double ret = 0;
	int n = a.size();
	for( int i = 1; i < (1<<n); i++ ){
		int ucnt = 0;
		double p = 1;
		for( int j = 0; j < n; j++ ){
			if( (i >> j) & 1 ){
				p *= a[j];
				ucnt++;
			}
		}
		if( ucnt & 1 )
			ret += p;
		else
			ret -= p;
	}
	return ret;
}
int n, m;
vector<int> et[20];
int efsize[20] = {0};
vector<double> ec[20];
int main()
{
	int i;
	cin >> n >> m;
	for( i = 0; i < m; i++ ){
		int a, b, c;
		cin >> a >> b >> c;
		et[a].push_back(b);
		efsize[b]++;
		ec[a].push_back((double)c/100);
	}
	
	double pro[20] = {0};
	vector<double> pros[20];
	
	pros[0].push_back(1);
	
	bool used_v[20] = {false};
	while( true ){
		for( i = 0; i < n; i++ )
			if( efsize[i] == 0 && !used_v[i] )
				break;
		if( i == n )
			break;
		
		//頂点iについて計算
		used_v[i] = true;
		pro[i] = getProOr( pros[i] );
		//頂点iから伝搬
		int v = i;
		for( i = 0; i < et[v].size(); i++ ){
			pros[et[v][i]].push_back(pro[v] * ec[v][i]);
			efsize[et[v][i]]--;
		}
	}
	cout << fixed << setprecision(14) << pro[n-1] << endl;
	return 0;
}
            
            
            
        