HDU 5963 朋友(树+博弈)
#include<vector> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 40010 using namespace std; int indeg[maxn]; vector<int> g[maxn]; int main() { int T,n,m; int u,v,w; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); memset(g,0,sizeof(g)); memset(indeg,0,sizeof(indeg)); for(int i=1;i<=n-1;i++){ scanf("%d%d%d",&u,&v,&w); if(w==1){ indeg[u]++; indeg[v]++; g[u].push_back(v); g[v].push_back(u); } } while(m--){ int op; scanf("%d",&op); if(op==0){ int t; scanf("%d",&t); if(indeg[t]%2) printf("Girls win!\n"); else printf("Boys win!\n"); } else{ int x,y,z; scanf("%d%d%d",&x,&y,&z); vector<int> ::iterator p1=find(g[x].begin(),g[x].end(),y); vector<int> ::iterator p2=find(g[y].begin(),g[y].end(),x); if(p1!=g[x].end()&&p2!=g[y].end()&&z==0){ indeg[x]--;//注意:要控制迭代器不能超过整个容器 indeg[y]--;//erase()函数返回值是一个迭代器,指向删除元素下一个元素 g[x].erase(p1); g[y].erase(p2); } if(p1==g[x].end()&&p2==g[y].end()&&z==1){ indeg[x]++;//如果g[x]中没找到y,g[y]没找到x indeg[y]++; g[x].push_back(y); g[y].push_back(x); } } } } }