链接: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
01-15 04:18