栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3579 Gao the variable

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3579 Gao the variable

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N=105*2;struct Search_t{int n;int G[N][N];int w[N][N];int op[N];int v[N];int used[N];int tmp_u[N];int ans,now;bool Can_choose(int k){for (int i=1;i<=n;i++){if (v[i] && !used[i] && G[k][i]) return false;if (v[i] && used[i] && G[i][op[k]]) return false;}return true;}int greedy(int k){int ret=0;for (int i=1;i<=n;i++) tmp_u[i]=used[i];        for (int i=k;i<=n;i++) if (!v[i]){     bool check=true;     for (int j=1;j<=n;j++)         if (v[j] && !used[j] && G[i][j]) { check=false; break; }     if (!check) continue;     ret+=w[i][i];     for (int j=1;j<=n;j++)         if (tmp_u[j])  ret+=w[i][j];     tmp_u[i]=1; }return ret;}void Choose(int k){v[k]=1;v[op[k]]=1;used[k]=1;now+=w[k][k];for (int i=1;i<=n;i++)if (v[i] && used[i] && i!=k) now+=w[i][k];}void Remove(int k){v[k]=0;v[op[k]]=0;used[k]=0;now-=w[k][k];for (int i=1;i<=n;i++)if (v[i] && used[i] && i!=k) now-=w[i][k];}void dfs(int dep){if (dep>n){if (now>ans) ans=now;return;}if (now+greedy(dep)<=ans) return;if (v[dep]) dfs(dep+1);else{bool s1=Can_choose(dep);bool s2=Can_choose(op[dep]);if (s1 && s2){Choose(dep);int w1=now+greedy(dep+1);Remove(dep);Choose(op[dep]);int w2=now+greedy(dep+1);Remove(op[dep]);if (w1>w2){Choose(dep);dfs(dep+1);Remove(dep);Choose(op[dep]);dfs(dep+1);Remove(op[dep]);}else{Choose(op[dep]);dfs(dep+1);Remove(op[dep]);Choose(dep);dfs(dep+1);Remove(dep);}}elseif (s1){Choose(dep);dfs(dep+1);Remove(dep);}elseif (s2){Choose(op[dep]);dfs(dep+1);Remove(op[dep]);}}}void gao(){memset(v,0,sizeof(v));memset(used,0,sizeof(used));now=0;ans=0;dfs(1);printf("%dn",ans);}}Search;#define op(x) ((x)>n?(x)-n:(x)+n)int m,n,Cn;int mat[N][N];int G[N][N];int Only[N][N];int Color[N];int P;void solve(){memset(G,0,sizeof(G));for (int i=1;i<=2*n;i++)for (int j=1;j<=2*n;j++)if (mat[i][j] && Color[i]!=Color[j])G[Color[i]][Color[j]]=1;memset(Only,0,sizeof(Only));for (int i=1;i<=n;i++){Only[Color[i]][Color[op(i)]]=1;Only[Color[op(i)]][Color[i]]=1;}memcpy(Search.G,G,sizeof(G));memset(Search.w,0,sizeof(Search.w));for (int i=1;i<=Cn;i++)for (int j=1;j<=Cn;j++)if (Only[i][j]){Search.op[i]=j;Search.op[j]=i;}Search.n=Cn;for (int i=0;i<P;i++){int a,b,x,y,w;scanf("%d%d%d%d%d",&a,&x,&b,&y,&w);if (x==0) a+=n;if (y==0) b+=n;Search.w[Color[a]][Color[b]]+=w;if (Color[a]!=Color[b]) Search.w[Color[b]][Color[a]]+=w;}Search.gao();}int main(){while (scanf("%d%d%d",&n,&m,&P)!=EOF){memset(mat,0,sizeof(mat));for (int i=0;i<m;i++){int x,y,c;char oper[10];char Tmp[10];scanf("%d %s %d %s %d",&x,oper,&y,Tmp,&c);switch (oper[0]){case 'x':if (c){mat[x][op(y)]=1;mat[y][op(x)]=1;mat[op(x)][y]=1;mat[op(y)][x]=1;}else{mat[x][y]=1;mat[y][x]=1;mat[op(x)][op(y)]=1;mat[op(y)][op(x)]=1;}break;case 'o':if (c){mat[op(x)][y]=1;mat[op(y)][x]=1;}else{mat[x][op(x)]=1;mat[y][op(y)]=1;}break;case 'a':if (c){mat[op(x)][x]=1;mat[op(y)][y]=1;}else{mat[x][op(y)]=1;mat[y][op(x)]=1;}break;}}for (int k=1;k<=2*n;k++)for (int i=1;i<=2*n;i++)for (int j=1;j<=2*n;j++)mat[i][j]|=mat[i][k]&mat[k][j];Cn=0;memset(Color,0,sizeof(Color));for (int i=1;i<=2*n;i++)if (!Color[i]){Color[i]=++Cn;for (int j=1;j<=2*n;j++)if (mat[i][j] && mat[j][i])Color[j]=Cn;}bool check=true;for (int i=1;i<=n;i++)if (Color[i]==Color[op(i)]) check=false;if (!check) puts("No solution");   else solve();}return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/382191.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号