首页 > 代码库 > codeforces #285 div.2 C. Misha and Forest

codeforces #285 div.2 C. Misha and Forest

技术分享

题目链接:    http://codeforces.com/contest/501/problem/C


题意:    给出图的每个顶点的度数和相邻顶点的异或值的和,求出这个图的边的情况和边的数目:

分析:   找出度为一的点,其所对应的异或值即为与之相邻的顶点(<- ^ ->),再将与之相邻顶点的度数减一:



**********代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;

const int maxn=1<<16+5;
int du[maxn],ytot[maxn];
vector< pair<int ,int > > V;

int main()
{
    int n,u,v;
    int i;
    while(scanf("%d",&n)!=EOF)
    {
         queue<int> Q;
         for(i=0;i<n;i++)
            V.clear();
         for(i=0;i<n;i++)
            scanf("%d%d",&du[i],&ytot[i]);
         for(i=0;i<n;i++)
            if(du[i]==1)   Q.push(i);
         while(!Q.empty())
            {
               u=Q.front();
               Q.pop();
               if(du[u]!=1) continue;
                 v=ytot[u];
                V.push_back(make_pair(u,v));
                du[v]--;
                 ytot[v]^=u;
                if( du[v]==1) Q.push(v);
            }
            printf("%d\n",V.size());
            for(i=0;i<V.size();i++)
                printf("%d %d\n",V[i].first,V[i].second);
    }
    return 0;
}





codeforces #285 div.2 C. Misha and Forest