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);
                }
            }
        }
    }
} 

 

posted @ 2017-02-17 16:49  despair_ghost  阅读(173)  评论(0编辑  收藏  举报