Atcoder ABC282(昨晚的比赛) D题求助
  • 板块学术版
  • 楼主kelanjie
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/12/18 21:01
  • 上次更新2023/10/24 07:16:20
查看原帖
Atcoder ABC282(昨晚的比赛) D题求助
699110
kelanjie楼主2022/12/18 21:01

思路懂了,但是A了38个点(3个样例不算),WA了9个点,还没调出来

#include<bits/stdc++.h>
using namespace std;
#define maxn 200010
int head[maxn],idx=0;
struct edge{
	int to,next;
}e[2*maxn];
void add(int u,int v)
{
	e[++idx].to=v;
	e[idx].next=head[u];
	head[u]=idx;
}
int pie[maxn],cnt[maxn][2],cf[maxn],deg[maxn];
int cont=0,tot=0;
bool vis[maxn],color[maxn],fl[maxn];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	int n,m,u,v;
	long long ans=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		add(u,v);//填边 
		add(v,u);
		deg[u]++;deg[v]++;
	}
	queue<int>q;
	for(int i=1;i<=n;i++)
		if(!vis[i])
		{
			q.push(i);
			color[i]=0;
			vis[i]=1;
			cnt[++cont][0]++;
			while(!q.empty())
			{
				pie[q.front()]=cont;
				for(int j=head[q.front()];j;j=e[j].next)
				{
					if(vis[e[j].to]&&color[e[j].to]==color[q.front()])
						fl[cont]=1;
					else if(!vis[e[j].to])
					{
						vis[e[j].to]=1;
						color[e[j].to]=1^color[q.front()];
						cnt[cont][1^color[q.front()]]++;
						q.push(e[j].to);
					}
				}
				q.pop();
			}
		}
	for(int i=1;i<=cont;i++)//处理总共多少个为二分图的点 
		if(!fl[i])
			tot+=(cnt[i][0]+cnt[i][1]);
	for(int i=1;i<=cont;i++)
		if(!fl[i])
			cf[i]=tot-cnt[i][0]-cnt[i][1];//除开当前连通块其他连通块共多少点 
	
//	for(int i=1;i<=cont;i++)
//		cout<<cf[i]<<" ";
//	cout<<'\n';
	
	for(int i=1;i<=cont;i++)
		if(!fl[i])
			ans+=(cnt[i][0]+cnt[i][1])*cf[i];
	for(int i=1;i<=n;i++)
		if(!fl[pie[i]])
			ans+=(cnt[pie[i]][1^color[i]]-deg[i]);
	cout<<ans/2;
	return 0;
}
2022/12/18 21:01
加载中...