ural1156. Two Rounds(二分染色+dfs)
2013-11-18 14:52
246 查看
好久没有写过题了,有点生疏啊,这题坑了好久......写了个裸的爆搜TLE了,然后将他分类后,只对有2个点以上的连通分量爆搜就过了,只含一个点的连通分量可以随便在两个round里选,所以可以不搜,最后随便放就行。
#include <iostream> #include <algorithm> #include <cstdio> #include <vector> #include <cstring> using namespace std; #define N 105 #define M 210 struct node { int to,next; } e[M]; int head ,esum; int n,m; inline void init() { memset(head,-1,sizeof(head)); esum=0; } inline void addedge(int u,int v) { e[esum].to=v,e[esum].next=head[u],head[u]=esum++; } int belong ,cnt; bool err,vis ; vector<int>lst [2]; vector<int>::iterator it; void dfs(int id,int flag) { if(err) return ; if(!belong[id]) { belong[id]=flag; lst[cnt/2][flag%2].push_back(id); } else if(belong[id]!=flag) { err=1; return ; } int col=1-(flag-cnt)+cnt; for(int i=head[id]; ~i; i=e[i].next) { int to=e[i].to; if(!belong[to]) dfs(to,col); else if(belong[to]!=col) { err=1; return ; } } } bool havFind; bool ans ; int sum; void findAns(int id,int s1,int s2) { if(havFind) return ; if(s1>n||s2>n) return ; if(id==cnt/2) { havFind=1; sum=s1; return ; } if(lst[id][0].size()+lst[id][1].size()>1) { ans[id]=0; findAns(id+1,s1+lst[id][0].size(),s2+lst[id][1].size()); if(havFind) return ; ans[id]=1; findAns(id+1,s1+lst[id][1].size(),s2+lst[id][0].size()); if(havFind) return ; } else findAns(id+1,s1,s2); } int main() { int a,b; while(~scanf("%d%d",&n,&m)) { init(); for(int i=0; i<m; i++) { scanf("%d%d",&a,&b); addedge(a,b); addedge(b,a); } memset(belong,0,sizeof(belong)); err=0,cnt=1; for(int i=1; i<=2*n; i++) if(!belong[i]) { lst[cnt/2][0].clear(); lst[cnt/2][1].clear(); dfs(i,cnt); if(err) break; cnt+=2; } if(err) puts("IMPOSSIBLE"); else { havFind=0; findAns(0,0,0); if(havFind) { int rest=n-sum; for(int i=0; i<cnt/2; i++) { if(lst[i][0].size()+lst[i][1].size()==1) { if(rest) ans[i]=1,rest--; else ans[i]=0; } } for(int i=0; i<cnt/2; i++) for(it=lst[i][ans[i]].begin(); it!=lst[i][ans[i]].end(); it++) printf("%d ",*it); puts(""); for(int i=0; i<cnt/2; i++) for(it=lst[i][!ans[i]].begin(); it!=lst[i][!ans[i]].end(); it++) printf("%d ",*it); puts(""); } else puts("IMPOSSIBLE"); } } return 0; }
相关文章推荐
- URAL 1156 Two Rounds (DFS二分染色 + 分组背包)
- URAL 1156 Two Rounds (DFS二分染色 + DFS枚举 + 剪枝)
- ural 1080. Map Coloring(二分染色bfs)
- ural 1156. Two Rounds
- ural 1106,二分图染色,DFS
- uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)
- ural 1080 Map Coloring DFS染色
- UVA10004Bicoloring(DFS)二分染色
- HDOJ 5971 Wrestling Match【2016大连现场】【dfs二分染色】
- 【二分+染色】【NOIP2010】关押罪犯 prison
- PAT甲题题解-1115. Counting Nodes in a BST (30)-(构建二分搜索树+dfs)
- Ural 1500Pass Licenses(状态压缩dfs)
- Codeforces 557D - Vitaly and Cycle (DFS染色)
- CF 208E Blood Cousins(二分+DFS)
- UVALive 6663 Count the Regions --离散化+DFS染色
- [BZOJ 1486][HNOI2009]最小圈(二分答案+dfs写的spfa判负环)
- hdu 1045 dfs 二分匹配
- 二分搜索+DFS
- 【二分答案】【DFS】【分类讨论】Gym - 100851F - Froggy Ford
- hdu 4751(dfs染色)