CF Gym 102059E Electronic Circuit (set存图删点)

Posted yokel062

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF Gym 102059E Electronic Circuit (set存图删点)相关的知识,希望对你有一定的参考价值。

链接:https://codeforces.com/gym/102059/problem/E

 

题意:n个点, m条线,问这个电路是否合法,合法:可以确定一个起点和一个终点。

题解:不断的删点,删除度数为2的点,再相连,看最终度数为1的点的个数是否为2。set存图

技术图片
#include <bits/stdc++.h>
using namespace std;

const int maxn=3e5+5;
set<int> S[maxn];
int n, m;

void del_edge()
{
    queue<int> que;
    for(int i=1; i<=n; i++)
        if(S[i].size()==2)
            que.push(i);
    while(!que.empty())
    {
        int u=que.front(); que.pop();
        if(S[u].size()!=2) continue;
        int pre=*S[u].begin(); S[u].erase(S[u].begin());
        int sub=*S[u].begin(); S[u].erase(S[u].begin());
        S[pre].erase(u); S[sub].erase(u);
        S[pre].insert(sub); S[sub].insert(pre);
        if(S[pre].size()==2) que.push(pre);
        if(S[sub].size()==2) que.push(sub);
    }
}

bool check()
{
    int cnt=0;
    for(int i=1; i<=n; i++)
        if(S[i].size()) cnt++;
    return cnt==2;
}

int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n>>m;
    for(int i=0; i<m; i++)
    {
        int u, v;
        cin>>u>>v;
        S[u].insert(v);
        S[v].insert(u);
    }
    del_edge();
    printf(check()? "Yes":"No");
    return 0;
}
View Code

 

以上是关于CF Gym 102059E Electronic Circuit (set存图删点)的主要内容,如果未能解决你的问题,请参考以下文章

CF Gym Dice Game BFS 暴搜

cf gym 100960 G. Youngling Tournament set+树状数组

cf gym 101124

CF Gym-101911A Coffee Break

CF gym102759IQuery On A Tree 17

CF GYM 100548 Last Defence