为啥80?!
查看原帖
为啥80?!
371749
tuxxx楼主2024/9/24 21:21

本人的80分程序:

#include<bits/stdc++.h>
using namespace std;
const int mxn=501;
int n,p,m,i,j,x,y,ans=1006,sum=0;
int vis[mxn],dp[mxn][mxn],cnt[mxn];
struct edge{
	int father,chid[mxn],num;
}node[mxn];
void Input(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		node[i].num=0;
		cnt[i]=1;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		if(x>y) swap(x,y);
		node[y].father=x;
		node[x].num++;
		node[x].chid[node[x].num]=y;
	}
}
void deep(int tree,int s){
	sum=max(sum,s);
	for(int i=1;i<=node[tree].num;i++){
		dp[s][0]++;
		dp[s][dp[s][0]]=node[tree].chid[i];
		deep(node[tree].chid[i],s+1);
	}
}
int Count(int tree){
	for(int i=1;i<=node[tree].num;i++){
		cnt[tree]+=Count(node[tree].chid[i]);
	}
	return cnt[tree];
}
void work(int tree,int teg){
	for(int i=1;i<=node[tree].num;i++){
		vis[node[tree].chid[i]]=teg;
		work(node[tree].chid[i],teg);
	}
}
void DFS(int s,int e){
	if(s==sum) ans=min(ans,e);
	int f=0;
	for(int i=1;i<=dp[s][0];i++){
		if(vis[dp[s][i]]>0){
			f++;
			continue;
		}
		vis[dp[s][i]]=1;
		work(dp[s][i],1);
		DFS(s+1,e-cnt[dp[s][i]]);
		vis[dp[s][i]]=0;
		work(dp[s][i],0);
	}
}
int main(){
	Input();
	deep(1,2);
	Count(1);
	DFS(2,n);
	printf("%d",ans);
	return 0;
}
2024/9/24 21:21
加载中...