社区讨论

萌新求助,为何内存爆了3个点

P1330封锁阳光大学参与者 3已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mi85wxu4
此快照首次捕获于
2025/11/21 09:09
4 个月前
此快照最后确认于
2025/11/21 09:09
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
int ver[200001],next[200001],head[10001],tot=0;
int vis[10001];
bool T=1,h[10001];
void add(int x,int y){
	ver[++tot]=y,next[tot]=head[x],head[x]=tot;
	return;
}
int dp(int root,int x,int data){
	h[x]=1;
	vis[x]=data;
	int ans;
	if(data==1) ans=1;
	else ans=0;
	for(register int i=head[x];i!=0;i=next[i]){
		int y=ver[i];
		if(y==root) continue;
		if(vis[y]==vis[x]){
			T=0;
			return -1; 
		}
		ans+=dp(x,y,data^1);
	}
	vis[x]=-1;
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	memset(head,0,sizeof(head));
	for(register int i=1;i<=m;++i){
		int t1,t2;scanf("%d%d",&t1,&t2);
		add(t1,t2),add(t2,t1);
	}
	for(register int i=1;i<=n;++i) vis[i]=-1;
	int ans=0;
	memset(h,0,sizeof(h));
	for(register int i=1;i<=n&&T;++i)
	    if(!h[i])
	        ans+=min(dp(0,i,0),dp(0,i,1));
	if(T==0) printf("Impossible\n");
	else printf("%d\n",ans);
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...