Codeforces Beta Round #27 D. Ring Road 2
来源:互联网 发布:雀神作弊软件 编辑:程序博客网 时间:2024/04/30 08:02
题意:有一个环,现给你一些区间的起点与终点,区间可以在环内,可以在环外,但是在环内环外的区间都不能彼此相交,问可能否,如果可能,输出方案。
2-SAT。
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <vector>#include <algorithm>#include <queue>#include <set>#include <map>using namespace std;typedef long long LL;typedef pair<int,int> PII;const int N=205;const int MaxN=11005;const int MaxE=51005;struct Edge{ int u,v,pre; Edge(){} Edge(int u,int v,int pre) : u(u),v(v),pre(pre) {}}edge[N*10];int hBef[N],hAft[N],nEdge;int n,m,L[N],R[N];bool insta[MaxN];int lab[MaxN],nLab;int sta[MaxN],top;int dfn[MaxN],low[MaxN],idx;int deg[MaxN],color[MaxN],other[MaxN];struct Tarjan_directed{void init(){nLab=top=idx=0;memset(lab,-1,sizeof(lab));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(insta,0,sizeof(insta));memset(deg,0,sizeof(deg));}void dfs(int u){insta[u]=1;sta[top++]=u;dfn[u]=low[u]=++idx;for(int i=hBef[u];i!=-1;i=edge[i].pre){int v=edge[i].v;if(!dfn[v]){dfs(v);low[u]=min(low[u],low[v]);}else if(insta[v]&&dfn[v]<low[u]) low[u]=dfn[v];}if(low[u]==dfn[u]){++nLab; int tmp;do{tmp=sta[--top];insta[tmp]=0;lab[tmp]=nLab;}while(tmp!=u);}}void solve(){ for(int i=0;i<n*2;i++) if(dfn[i]==0) dfs(i);}}tar;void addEdge(int u,int v,int head[]){ edge[nEdge]=Edge(u,v,head[u]); head[u]=nEdge++;}void edgeInit(){ nEdge=0; memset(hBef,-1,sizeof(hBef)); memset(hAft,-1,sizeof(hAft));}bool Intersect(int L1,int R1,int L2,int R2){ if(L1>L2) swap(L1,L2),swap(R1,R2); if(L1==L2&&R1<R2) swap(L1,L2),swap(R1,R2); if(R1<=L2) return false; if(R2<=R1) return false; return true;}void BuildGraph(){ for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) if(Intersect(L[i],R[i],L[j],R[j])) { addEdge(i,j+n,hBef); addEdge(j,i+n,hBef); addEdge(i+n,j,hBef); addEdge(j+n,i,hBef); } }}void RebuildGraph(){ int tmp=nEdge; for(int i=0;i<tmp;i++) { int u=lab[edge[i].u],v=lab[edge[i].v]; if(u-v) { addEdge(v,u,hAft); deg[u]++; } }}bool HasAns(){ for(int i=0;i<n;i++) { int u=lab[i],v=lab[i+n]; other[u]=v; other[v]=u; if(u==v) { puts("Impossible"); return false; } } return true;}void TopSort(){ memset(color,0,sizeof(color)); queue<int> que; for(int i=1;i<=nLab;i++) if(deg[i]==0) que.push(i); while(que.size()) { int u=que.front(); que.pop(); if(color[u]==0) { color[u]=1; color[other[u]]=2; } for(int i=hAft[u];i!=-1;i=edge[i].pre) { int v=edge[i].v; if(--deg[v]==0) que.push(v); } }}void OutputAns(){ for(int i=0;i<n;i++) { if(color[lab[i]]==1) putchar('i'); else putchar('o'); } puts("");}void TwoSAT(){ BuildGraph(); tar.init(); tar.solve(); if(HasAns()==0) return; RebuildGraph(); TopSort(); OutputAns();}int main(){ while(scanf("%d%d",&m,&n)!=EOF) { edgeInit(); for(int i=0;i<n;i++) { scanf("%d%d",&L[i],&R[i]); if(L[i]>R[i]) swap(L[i],R[i]); } TwoSAT(); }return 0;}
- Codeforces Beta Round #27 D. Ring Road 2
- Codeforces Beta Round #27 (Codeforces format, Div. 2) D Ring Road 2(二分图染色版)
- [Codeforces 27D] Ring Road 2 (二分图染色)
- CF 27D Ring Road 2
- CodeForces 27D - Ring Road 2 构图2-sat..并输出选择方案
- Codeforces Beta Round #51 D
- CF-27D. Ring Road 2(涂色)
- Codeforces Beta Round #2
- Codeforces Beta Round #2
- Codeforces Beta Round #2
- Codeforces Beta Round #2
- Codeforces Beta Round #2
- 【KMP】Codeforces Beta Round #93 (Div. 2 Only) D
- Codeforces Beta Round #35 (Div. 2), problem: (D) Animals DP
- Codeforces Beta Round #75 (Div. 2 Only)——D
- Codeforces Beta Round #52 (Div. 2) D - Changing a String
- Codeforces Beta Round #95 (Div. 2) D.Subway
- Codeforces Beta Round #89 (Div. 2)D. Caesar's Legions
- Qt5--模块的分类与概述
- Divide Two Integers (只用加减法做除法,logn复杂度) 【leetcode】
- 神奇的Gamma函数
- JSP的会话跟踪技术
- Android Camera porting(HAL层移植)
- Codeforces Beta Round #27 D. Ring Road 2
- android4.0 camera hal 移植
- POJ 1000 A+B Problem
- JavaScript加强之Prototype
- 为什么要学习C语言(转载)
- python的socket基本使用
- POJ 1003 Hangover
- Android小项目之八 界面细节
- memcpy()与strcpy()的完全实现