标签:ack weight limit mem str targe typedef turn vector
hihoCoder新春晚会正在紧张地筹备中。晚会分为上半场和下半场,总导演小Hi现在要为N个节目安排演出时间(上半场或下半场)。为了描述方便,我们将第i个节目对应两个编号2i-1和2i,分别表示把第i个节目安排在上半场和下半场。
由于演员、道具和布景的限制。有些安排之间存在冲突,比如编号1的安排和编号4的安排有冲突,意味着"把第1个节目安排在上半场"同"把第2个节目安排在下半场"有冲突。
现在小Hi手里有M对编号,表示冲突的节目安排。他的任务是帮助主办方安排出节目演出的合理时间。
第一行包含两个非负整数n和m(n≤8000,m≤20000),代表有n个节目和m对冲突。
接下来m行每行两个数x和y,表示编号x和编号y冲突。
输出n行,每行一个数,从小到大输出最后进行演出的编号。若有多解,则输出字典序最小的。无解则输出NIE。
3 2 1 3 2 4
1 4 5
#include <iostream> #include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <time.h> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define met(a,b) memset(a,b,sizeof a) #define pb push_back #define lson(x) ((x<<1)) #define rson(x) ((x<<1)+1) using namespace std; typedef long long ll; const int N=2e4+5; const int M=4e5+10; struct Edge { int to,next; } edge[M]; int head[M],tot; void init() { tot = 0; memset(head,-1,sizeof(head)); } void addedge(int u,int v) { edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++; } bool vis[N];//染色标记,为true表示选择 int S[N],top;//栈 bool dfs(int u) { if(vis[u^1])return false; if(vis[u])return true; vis[u] = true; S[top++] = u; for(int i = head[u]; i != -1; i = edge[i].next) if(!dfs(edge[i].to)) return false; return true; } bool Twosat(int n) { memset(vis,false,sizeof(vis)); for(int i = 0; i < n; i += 2) { if(vis[i] || vis[i^1])continue; top = 0; if(!dfs(i)) { while(top)vis[S[--top]] = false; if(!dfs(i^1)) return false; } } return true; } int main() { int n,m; int u,v; scanf("%d%d",&n,&m); init(); while(m--) { scanf("%d%d",&u,&v); u--; v--; addedge(u,v^1); addedge(v,u^1); } if(Twosat(2*n)) { for(int i = 0; i < 2*n; i++) if(vis[i]) printf("%d\n",i+1); } else printf("NIE\n"); return 0; }
hiho一下第134周 1468 : 2-SAT·hihoCoder新春晚会
标签:ack weight limit mem str targe typedef turn vector
原文地址:http://www.cnblogs.com/jianrenfang/p/6416883.html