1. 程式人生 > >Wannafly挑戰賽25

Wannafly挑戰賽25

POINT:

我覺得題解說的很棒了。

題解:

題目中對於圖的限制可以看做 1 到 n 的所有簡單路徑互不相交。 在結束遊戲前的最後一步一定是剩下一條 1 到 n 的路徑,並且路徑上的權值全都是一。如 果剩下的最後一條路徑確定了,遊戲的總步數也確定了,那麼先後手的勝負也確定了。 那麼雙方的策略就使盡可能使最後留下的路徑是使自己必勝的路徑,即儘可能切斷使對方 必勝的路徑。【切斷一條路徑需要的步數是這條路徑上的權值的最小值】。我們只需要比較雙方切斷對方必勝的路徑所需要的步數即可。

然後根據總權值的奇偶來討論一下就行了。

大家都是盯著那些【切斷一條路徑需要的步數是這條路徑上的權值的最小值】切的。

所以切的地方都是各顧各的,只是看誰要切的比較多而已

#include <stdio.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
#define LL long long
const int N = 1e5+55;
const int inf = 0x3f3f3f3f;

vector<int>G[N],W[N];
LL num[2];
int n,m;

int main()
{
	scanf("%d%d",&n,&m);
	LL sum=0;
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		G[u].push_back(v);G[v].push_back(u);
		W[u].push_back(w);W[v].push_back(w);
		sum+=w;
	}
	dfs(1,-1,0,inf);
	int flag=0;
	if(sum&1){
		if(num[0]>=num[1]) flag=1;
	}else{
		if(num[1]>=num[0]) flag=1;
	}
	if(flag) printf("Yes\n");
	else printf("No\n");
}