HDU 1814 2-sat
阿新 • • 發佈:2018-10-31
Peaceful Commission
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5912 Accepted Submission(s): 1881
The Commission has to fulfill the following conditions:
1.Each party has exactly one representative in the Commission,
2.If two deputies do not like each other, they cannot both belong to the Commission.
Each party has exactly two deputies in the Parliament. All of them are numbered from 1 to 2n. Deputies with numbers 2i-1 and 2i belong to the i-th party .
Task
Write a program, which:
1.reads from the text file SPO.IN the number of parties and the pairs of deputies that are not on friendly terms,
2.decides whether it is possible to establish the Commission, and if so, proposes the list of members,
3.writes the result in the text file SPO.OUT.
There are multiple test cases. Process to end of file.
Sample Output 1 4 5 部落格 https://blog.csdn.net/jarjingx/article/details/8521690
程式碼
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fi first #define se second #define all(a) (a).begin(), (a).end() #define fillchar(a, x) memset(a, x, sizeof(a)) #define huan printf("\n") #define debug(a,b) cout<<a<<" "<<b<<" "<<endl #define ffread(a) fastIO::read(a) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MAXN = 20020; const int MAXM = 100010; struct Edge { int to,next; } edge[MAXM]; int head[MAXN],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[MAXN]; //染色標記,為 true 表示選擇 int S[MAXN],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; while(scanf("%d%d",&n,&m) == 2) { 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; }