【CodeForces - 501C 】Misha and Forest(思維)

題意:給一個森林,有n個點編號爲0~n-1,告訴每個點的度數,和所有與他連邊的結點編號的異或和,問這個森林是什麼樣子,輸出邊。

思路:

從葉子結點考慮,葉子結點的異或和的值就是與它連邊的點的編號,然後那個點的度數減一,重複這樣操作。

AC代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=100000;
queue<int> q;
int u[maxn],v[maxn],tot=0,n,in[maxn],val[maxn];
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        scanf("%d%d",&in[i],&val[i]);
        if(in[i]==1) q.push(i);
    }
    while(!q.empty()){
        int nn=q.front();
        q.pop();
        if(in[nn]==0)continue;
        u[tot]=nn;
        v[tot++]=val[nn];
        val[val[nn]]^=nn;
        in[val[nn]]--;
        if(in[val[nn]]==1) q.push(val[nn]);
    }
    printf("%d\n",tot);
    for(int i=0;i<tot;i++)printf("%d %d\n",u[i],v[i]);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章