链接:https://codeforces.com/gym/102059/problem/E
题意:n个点, m条线,问这个电路是否合法,合法:可以确定一个起点和一个终点。
题解:不断的删点,删除度数为2的点,再相连,看最终度数为1的点的个数是否为2。set存图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }