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; }
以上是关于CF Gym 102059E Electronic Circuit (set存图删点)的主要内容,如果未能解决你的问题,请参考以下文章
cf gym 100960 G. Youngling Tournament set+树状数组