【NOIP2018模拟】电压机制

版权声明:本文为博主原创文章。 https://blog.csdn.net/qq_37657307/article/details/83214474

【问题描述】

科学家在“无限神机”(Infinity Machine)找到一个奇怪的机制,这个机制有N 个元件,有M条电线连接这些元件,所有元件都是连通的。两个元件之间可能有多条 电线连接。 科学家对这些元件可以任意地设置为“高电压”和“低电压”两种模式,如果一 条电线的一端为高电压,另一端为低电压,这条电线就会产生电流。 为了安全的研究“无限神机”,科学家需要找到一条电线,将它的两端设为相同 的电压,并且除选择的这条电线外,其它所有电线都有电流(否则就没有研究的价值 了)。 有多少条电线满足这样的条件?

【输入格式】

从文件 voltage.in 中读入数据。 输入的第一行包含两个正整数 n, m ,表示元件数和电线数。 接下来 m 行,每行两个整数 u, v,表示元件 u 和元件 v 有一条电线连接

【输出格式】

输出到文件 voltage.out 中。 输出一个整数,表示有多少条电线满足条件。

【样例1输入】

4 5 1 2 1 3 1 4 2 4 3 4

【样例1输出】

1

【样例1说明】

只有电线(1,4)满足  

【样例2输入】

4 4 1 2 2 3 3 2 4 3

【样例2输出】

2

【样例2说明】

电线(1,2)和(3,4)满足要求

【数据范围】

对于10%的数据,满足 n ≤ 1000 , m ≤ 2000

对于另外10%的数据,满足 m = n

对于另外35%的数据,满足 m ≤ n + 100

对于100%的数据,满足 2 ≤ n ≤ 100000 , 1 ≤ m ≤ 200000

题目翻译

对一个无向图,寻找有多少条边满足:删去这条边后,使图为二分图,且这条边的端点不在二分图的同一侧

二层翻译

 寻找有多少条边满足:图中所有奇环都包含这条边,且这条边不属于任何偶环

直接说100%数据的做法

建一棵DFS树,通过返祖边找环

对每个点记录一个cnt,当返祖边u->v形成奇环(染色法判断)时cnt[u]++,cnt[v]--,偶环时反过来,并确定这条边一定不能被选。这样以后u的子树内所有的cnt之和就表示了u->fa这条边被多少奇环包含(差分前缀和思想)。

code

#include<bits/stdc++.h>//正式比赛别乱用
using namespace std;
struct mzls
{
	int to,id;
}as;
vector<mzls>g[100005];
bool c[100005],f[100005],f1[200005];//注意边和点不同的范围
int cnt[200005],tot[200005],n,m,ans,t1;
inline void dfs(int u)
{
	f[u]=1;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].to,d=g[u][i].id;
		if(f1[d])
			continue;
		f1[d]=1;
		if(f[v]&&c[v]==c[u])//颜色相同时为奇环
		{
			t1++;//记录图中所有的奇环
			cnt[u]++;
			cnt[v]--;
			tot[d]++;
			continue;
		}
		if(f[v])
		{
			cnt[v]++;
			cnt[u]--;
			tot[d]--;//这里被减了以后d这条边永远不可能被选
			continue;
		}
		c[v]=!c[u];//交叉染色
		dfs(v);
		tot[d]+=cnt[v];
		cnt[u]+=cnt[v];//从下往上传
	}
}
int main()
{
	//freopen("voltage.in","r",stdin);
	//freopen("voltage.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		as.to=y,as.id=i;//每条边单独记录id,因为两点之间可以有重边
		g[x].push_back(as);
		as.to=x;
		g[y].push_back(as);
	}
	dfs(1);
	for(int i=1;i<=m;i++)
		if(tot[i]==t1)
			ans++;
	printf("%d\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_37657307/article/details/83214474