听灌多,捞,玄3关
  • 板块灌水区
  • 楼主onlymys
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/7/11 16:33
  • 上次更新2024/7/11 17:19:11
查看原帖
听灌多,捞,玄3关
1280525
onlymys楼主2024/7/11 16:33

为什么这道题贪心不可以呢

#include<bits/stdc++.h>
using namespace std;
int n,m;
#define N 10005
#define M 300005
#define memset(Color,x,n) for(int i=1;i<=n;i++) Color[i]=x;
vector<int> E[N];
int Color[N],color=1,vis[N];
inline void adde(int u,int v){
	E[v].push_back(u);
}
inline void GetColor(int u,int c){
	if(E[u].size()==0) return;
	vis[u]=1;Color[u]=c;
	for(auto v:E[u]){
		c^=1;
		if(!vis[v])
			GetColor(v,c^1);
	}
}
vector<int> A,B;
int maxt,SizeA,SizeB,SizeO;
struct Ans{int u,v;};
vector<Ans> ans;
int vist[N];
inline void GetAnsA(){
	for(auto u:A){
		if(E[u].size()!=1) continue;
		int v=E[u][0];
		vist[u]=1;
		if(!vist[v]) ans.push_back({min(u,v),max(u,v)});
		if(E[v].size()) vist[v]=1;
	}
}
inline void GetAnsB(){
	for(auto u:B){
		if(E[u].size()!=1) continue;
		int v=E[u][0];
		vist[u]=1;
		if(!vist[v])
			ans.push_back({min(u,v),max(u,v)});
		if(E[v].size()) vist[v]=1;
	}
}
inline bool cmp(Ans a,Ans b){
	if(a.u==b.u) return a.v<b.v;
	return a.u<b.u;
}
signed main() {
	scanf("%d%d",&n,&m);int u,v;
	if(m==0){printf("0\n");return 0;}
	for(register int i=1;i<=m;i++){
		scanf("%d%d",&u,&v);
		adde(u,v);adde(v,u);
	}memset(Color,-1,n);
	for(register int i=1;i<=n;i++)
		if(Color[i]==-1) 
			GetColor(i,1);
	for(register int i=1;i<=n;i++){
		if(Color[i]==1) A.push_back(i);
		else if(Color[i]==0) B.push_back(i);
	}
	SizeA=A.size();
	SizeB=B.size();
	maxt=max(SizeA,SizeB);
	if(SizeA>=maxt) GetAnsA();
	if(SizeB>=maxt) GetAnsB();
	printf("%d\n",ans.size());
	sort(ans.begin(),ans.end(),cmp);
	for(auto i:ans) printf("%d %d\n",i.u,i.v);
	return 0;
}

P3731

2024/7/11 16:33
加载中...