Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:xxxxxxxxxxxxxxxIn Reply To:xxxxxxxxxxxxxxx Posted by:zhangxiao1124 at 2008-05-05 20:39:19 great ,赞! > /* > 先求补图Init(),再黑白染色Calc(),然后Dp(),最后Print() > */ > #include<iostream> > using namespace std; > #define maxn 105 > #define Inf 1000000 > int n,m,v[maxn],s[maxn][2],f[maxn][maxn],p[maxn][maxn]; > bool g[maxn][maxn]; > > void Init() { > scanf("%d",&n); > for (int i=1; i<=n; i++) { > int j; > while (scanf("%d",&j),j) g[i][j]=true; > } > for (int i=1; i<=n-1; i++) > for (int j=i+1; j<=n; j++) > g[i][j]=g[j][i]=!(g[i][j] && g[j][i]); > } > > bool Dye(int i,int flag) { > v[i]=(flag)?-m:m,s[m][flag]++; > for (int j=1; j<=n; j++) if (g[i][j]) > if (v[i]==v[j] || !v[j] && !Dye(j,flag^1)) return false; > return true; > } > > bool Calc() { > for (int i=1; i<=n; i++) if (!v[i]) { > m++; > if (!Dye(i,0)) return false; > } > return true; > } > > void Dp() { > fill_n(f[0],maxn*maxn,-Inf); > for (int j=0; j<=n/2; j++) f[0][j]=0; > for (int i=1; i<=m; i++) > for (int j=1; j<=n/2; j++) > if (s[i][1]) { > if (j>=s[i][0]) f[i][j]=f[i-1][j-s[i][0]]+s[i][0]; > if (j>=s[i][1] && f[i-1][j-s[i][1]]+s[i][1]>f[i][j]) { > f[i][j]=f[i-1][j-s[i][1]]+s[i][1]; > p[i][j]=1; > } > } else { > f[i][j]=f[i-1][j],p[i][j]=-1; > if (j>=s[i][0] && f[i-1][j-s[i][0]]+s[i][0]>f[i][j]) { > f[i][j]=f[i-1][j-s[i][0]]+s[i][0]; > p[i][j]=0; > } > } > } > > bool ans[maxn]; > int rec[maxn]; > void Print() { > int limit=n/2,now=m; > while (now>0) { > rec[now]=p[now][limit]; //一开始打成p[limit][now] , 郁闷了好半天 > if (rec[now]>-1) limit-=s[now][rec[now]]; > now--; > } > for (int i=1; i<=n; i++) > if (v[i]>0 && rec[v[i]]==0) ans[i]=true; > else if (v[i]<0 && rec[-v[i]]==1) ans[i]=true; > printf("%d",f[m][n/2]); > for (int i=1; i<=n; i++) if (ans[i]) printf(" %d",i); printf("\n"); > printf("%d",n-f[m][n/2]); > for (int i=1; i<=n; i++) if (!ans[i]) printf(" %d",i); printf("\n"); > } > > int main() { > Init(); > if (!Calc()) { > puts("No solution"); > return 0; > } > Dp(); > Print(); > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator