zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    C语言I博客作业05
    C语言I博客作业04
    C语言II博客作业04
    C语言II博客作业03
    C语言II—作业02
    C语言II博客作业01
    学期总结
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
  • 原文地址:https://www.cnblogs.com/Yokel062/p/11650583.html
Copyright © 2011-2022 走看看