题意:n个节点,m条电路,判断该电路是否是一个正确的简单电路;
分析:由题目可以分析出,一个简单电路是指电路中有一个正极一个负极,那么我们考虑简化电路,正确的电路最后应该只剩下两个点和一条电路;比如说1-2和2-3就可以将节点2删除,建立一条1-3的新边,因为1和3可以通过2互相到达,要注意的是,有且仅有2个节点相邻的节点才可以被删掉;还有就是,题目上说明会存在并联的情况,其实仔细思考就可以知道,正确电路中并联是不会造成任何影响的,比如说当前有1-2,2-3和1-3,此时存在一个并联,但前文可知可以删掉2变成1-3,两条1-3与一条作用相同,处理重边时可以直接用set,这样建立新边时也可以直接去重;
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
const int mod=1e9+7;
const ll INF=1e18;
set<int> g[maxn];
int vis[maxn];
queue<int> Q;
int tot;
void dfs(int x)
{
if(g[x].size()!=2) return;
vis[x]=1;tot--;
int a=*g[x].begin();g[x].erase(a);
int b=*g[x].begin();
g[a].erase(x);g[b].erase(x);
g[a].insert(b);g[b].insert(a);
if(!vis[a]) dfs(a);
if(!vis[b]) dfs(b);
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
g[x].insert(y);g[y].insert(x);
}
tot=n;
for (int i=1;i<=n;i++) if(!vis[i]) dfs(i);
if(tot==2) printf("Yes\n");
else printf("No\n");
return 0;
}