首页 > 代码库 > hiho一下第134周 1468 : 2-SAT·hihoCoder新春晚会

hiho一下第134周 1468 : 2-SAT·hihoCoder新春晚会

1468 : 2-SAT·hihoCoder新春晚会

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

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新春晚会