tyvj4869 罪犯分组
看数据范围,果断状压。真是比愤怒的小鸟还智障。。。。。
#include<bits/stdc++.h> using namespace std; #define MAXN 500000+10 const int INF=0xffffff; struct ed{int u,v;}edge[20]; int n,m,k,mx,all=0,cnt[MAXN],ex[20],st[MAXN],dp[MAXN]; int main(){ scanf("%d%d%d",&n,&m,&k); mx=(1<<n)-1; for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); edge[i].u=u,edge[i].v=v; } for(int i=0;i<=mx;i++){ memset(ex,0,sizeof(ex)); int p=i,b=1,tot=0; while(p){ if(p&1)ex[b]=1; p>>=1;b++; } for(int j=1;j<=m;j++) if(ex[edge[j].u]&&ex[edge[j].v])tot++; cnt[i]=tot; if(tot<=k)st[++all]=i,dp[i]=1; else dp[i]=INF; } for(int i=0;i<=mx;i++) for(int j=1;j<=all;j++){ int p=i^st[j]; dp[i]=min(dp[i],dp[p]+1); } printf("%d",dp[mx]); return 0; }
Hello World