Wannafly挑戰賽25
阿新 • • 發佈:2018-12-12
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"); }