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:2^500爆搜 250ms 没有彪你,自己YY的,不会多项式算法,写了个爆搜In Reply To:2^500爆搜 250ms 没有彪你,自己YY的,不会多项式算法,写了个爆搜 Posted by:JiaJunpeng at 2015-12-30 09:35:56 > 爆搜+上下界剪纸 #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<cstring> using namespace std; int n,m,adj[555][555],num[555],ans[555],list[555],cnt_list,pre,st[555]; int queue[555],temp1,temp2,temp,e[2][255555]; bool vis[555],mark[555]; bool bfs(int id) { int ip,i,j,s,p,q; st[id]=0; temp1=temp2=0; temp=1; queue[0]=id; while(temp1<=temp2) { for(i=temp1;i<=temp2;i++) { id=queue[i]; for(j=0;j<num[id];j++) { ip=adj[id][j]; if(mark[ip]) { if(st[ip]<0) { st[ip]=st[id]^1; queue[temp++]=ip; } else if(st[ip]!=(st[id]^1)) return false; } else { if(st[ip]<0) st[ip]=st[id]^1; else if(st[ip]!=(st[id]^1)&&!vis[ip]) { vis[ip]=true; list[cnt_list++]=ip; } } } } temp1=temp2+1; temp2=temp-1; } for(i=0;i<n;i++) { if(!mark[i]&&st[i]>=0) st[i]=-1; } return true; } bool check() { int ip,id,i,j,s,p,q,ls[555],cnt_ls=0; memset(mark,false,sizeof(mark)); for(i=0;i<cnt_list;i++) { id=list[i]; for(j=0;j<num[id];j++) { ip=adj[id][j]; if(!mark[ip]) { mark[ip]=true; ls[cnt_ls++]=ip; } } } memset(st,-1,sizeof(st)); for(i=0;i<cnt_ls;i++) { if(st[ls[i]]<0) { if(!bfs(ls[i])) return false; } } return true; } void color() { int id,ip,i,j,s,p,q,ls[555],cnt_ls=0; memset(mark,false,sizeof(mark)); for(i=0;i<cnt_list;i++) { id=list[i]; if(!mark[id]) mark[id]=true; } for(i=0;i<n;i++) { if(!mark[i]) ls[cnt_ls++]=i; } memset(st,-1,sizeof(st)); for(i=0;i<cnt_ls;i++) { id=ls[i]; if(st[ls[i]]<0) { temp1=temp2=0; temp=1; queue[0]=id; st[id]=0; while(temp1<=temp2) { for(j=temp1;j<=temp2;j++) { id=queue[j]; for(s=0;s<num[id];s++) { ip=adj[id][s]; if(!mark[ip]) { if(st[ip]<0) { st[ip]=st[id]^1; queue[temp++]=ip; } else if(st[ip]!=(st[id]^1)) { while(true) puts("orz"); } } } } temp1=temp2+1; temp2=temp-1; } } } for(i=0;i<cnt_ls;i++) ans[ls[i]]=st[ls[i]]+1; for(i=0;i<cnt_list;i++) ans[list[i]]=0; } bool check_upper_bound() { int i,j,s,p,q,id,ip; memset(st,-1,sizeof(st)); memset(mark,false,sizeof(mark)); for(i=0;i<cnt_list;i++) mark[list[i]]=true; for(i=0;i<n;i++) { if(!mark[i]&&st[i]<0) { temp1=temp2=0; temp=1; queue[0]=i; st[i]=0; while(temp1<=temp2) { for(j=temp1;j<=temp2;j++) { id=queue[j]; for(s=0;s<num[id];s++) { ip=adj[id][s]; if(!mark[ip]) { if(st[ip]<0) { st[ip]=st[id]^1; queue[temp++]=ip; } else if(st[ip]!=(st[id]^1)) return false; } } } temp1=temp2+1; temp2=temp-1; } } } return true; } bool dfs(int id) { int i,j,s,p,q,fr,ip; fr=cnt_list; list[cnt_list++]=id; memset(vis,false,sizeof(vis)); pre=0; while(pre<cnt_list) { for(j=pre;j<cnt_list;j++) vis[list[j]]=true; pre=cnt_list; if(!check()) { cnt_list=fr; memset(vis,false,sizeof(vis)); for(i=0;i<cnt_list;i++) { vis[list[i]]=true; for(j=0;j<num[list[i]];j++) vis[adj[list[i]][j]]=true; } return false; } for(j=0;j<n;j++) { if(mark[j]) vis[j]=true; } } if(check_upper_bound()) { color(); return true; } memset(vis,false,sizeof(vis)); for(i=0;i<cnt_list;i++) { ip=list[i]; vis[ip]=true; for(j=0;j<num[ip];j++) vis[adj[ip][j]]=true; } for(i=id+1;i<n;i++) { if(!vis[i]) { if(dfs(i)) return true; } } cnt_list=fr; memset(vis,false,sizeof(vis)); for(i=0;i<cnt_list;i++) { vis[list[i]]=true; for(j=0;j<num[list[i]];j++) vis[adj[list[i]][j]]=true; } return false; } bool fill() { int i,j,s,p,q,cnt=0,fr,id; list[0]=0; ans[0]=0; pre=0; cnt_list=1; memset(vis,false,sizeof(vis)); while(pre<cnt_list) { for(i=pre;i<cnt_list;i++) vis[list[i]]=true; pre=cnt_list; if(!check()) return false; for(i=0;i<n;i++) { if(mark[i]) vis[i]=true; } } for(i=pre;i<cnt_list;i++) vis[list[i]]=true; if(check_upper_bound()) { color(); return true; } for(i=0;i<n;i++) { if(!vis[i]) { if(dfs(i)) return true; } } return false; } int main() { int i,j,s,p,q,id1,id2; while(scanf("%d%d",&n,&m)&&(n||m)) { memset(num,0,sizeof(num)); for(i=0;i<m;i++) { scanf("%d%d",&id1,&id2); adj[id1][num[id1]++]=id2; adj[id2][num[id2]++]=id1; } if(fill()) { for(i=0;i<n;i++) printf("%d ",ans[i]); printf("\n"); } else printf("The agents cannot be split\n"); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator