Codeforces Gym102059 E. Electronic Circuit【思维+BFS/DFS】

题目链接:E. Electronic Circuit

题意: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值