結果

問題 No.298 話の伝達
ユーザー startcppstartcpp
提出日時 2015-11-06 23:24:05
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 1,172 bytes
コンパイル時間 627 ms
コンパイル使用メモリ 71,684 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-09-13 13:49:43
合計ジャッジ時間 1,583 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 WA -
testcase_05 AC 18 ms
6,940 KB
testcase_06 WA -
testcase_07 AC 2 ms
6,940 KB
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 AC 2 ms
6,944 KB
testcase_12 AC 2 ms
6,944 KB
testcase_13 WA -
testcase_14 WA -
testcase_15 AC 2 ms
6,940 KB
testcase_16 AC 67 ms
6,940 KB
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#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( m != 0 ){
		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]]--;
		}
		m--;
	}
	cout << fixed << setprecision(14) << pro[n-1] << endl;
	return 0;
}
0