/* 我觉得挺对的啊 实在是考虑不到有什么情况会判不了 70分 就这样吧 - - */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<vector> #define maxn 310 using namespace std; int init() { int x=0;char s=getchar(); while(s<‘0‘||s>‘9‘)s=getchar(); while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();} return x; } int n,m,c[maxn],son[maxn][maxn],sum[maxn],g[maxn][maxn],f[maxn]; int size[maxn],fa[maxn],ans=0x3f3f3f3f; vector<int>so[maxn]; void Build(int i) { f[i]=1; for(int j=0;j<so[i].size();j++) { int Son=so[i][j]; if(f[Son]==0) { fa[Son]=i; son[i][++sum[i]]=Son; Build(Son); } } } void Dfs(int i,int num) { int get=0; if(num>=ans)return; int Sum=0; for(int j=1;j<=size[i];j++) if(f[fa[g[i][j]]]==0) { Sum++; get=1; } else f[g[i][j]]=1; for(int j=1;j<=size[i];j++) { if(f[g[i][j]]==0) { f[g[i][j]]=1; Dfs(i+1,num+Sum-1); f[g[i][j]]=0; for(int k=1;k<=sum[g[i][j]];k++) f[son[g[i][j]][k]]=0; } } if(get==0) { ans=min(ans,num); return; } } int main() { n=init();m=init(); int x,y; c[1]=1; for(int i=1;i<=m;i++) { x=init();y=init(); so[x].push_back(y); so[y].push_back(x); } Build(1); memset(f,0,sizeof(f)); size[1]=1;g[1][1]=1; for(int i=1;i<=n;i++) for(int j=1;j<=sum[i];j++) { int t=c[i]+1; c[son[i][j]]=t; g[t][++size[t]]=son[i][j]; } Dfs(2,1); printf("%d\n",ans); return 0; }
/* 看了题解之后的 感觉思路和自己的差不多 只不过这样清晰多了 (好吧 不止清晰 .....100分 -) */ #include<iostream> #include<cstdio> #include<cstring> #include<vector> #define maxn 310 using namespace std; int init() { int x=0;char s=getchar(); while(s<‘0‘||s>‘9‘)s=getchar(); while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();} return x; } int n,m,Max_c,son[maxn][maxn],sum[maxn],c[maxn]; int ans=0x3f3f3f3f,num=1,f[maxn]; vector<int>so[maxn]; void Build(int i) { f[i]=1; for(int j=0;j<so[i].size();j++) { int Son=so[i][j]; if(f[Son]==0) { son[i][++sum[i]]=Son; Build(Son); } } } void Dfs(int p) { int get=0; if(num>=ans)return; int Sum=0; for(int i=1;i<=n;i++) if(c[i]==p) for(int j=1;j<=sum[i];j++) { get=1; c[son[i][j]]=p+1; num++; } num--; for(int i=1;i<=n;i++) if(c[i]==p+1) { c[i]=0; Dfs(p+1); c[i]=p+1; } num++; for(int i=1;i<=n;i++) if(c[i]==p+1) { c[i]=0;num--; } if(get==0) { ans=min(ans,num); return; } } int main() { n=init();m=init(); int x,y; c[1]=1; for(int i=1;i<=m;i++) { x=init();y=init(); so[x].push_back(y); so[y].push_back(x); } Build(1); for(int i=1;i<=n;i++) for(int j=1;j<=sum[i];j++) { int t=c[i]+1; Max_c=max(Max_c,t); c[son[i][j]]=t; } memset(c,0,sizeof(c)); c[1]=1; Dfs(1); printf("%d\n",ans); return 0; }
时间: 2024-10-11 07:05:17