码迷,mamicode.com
首页 > 其他好文 > 详细

UVAlive3713 Astronauts(2-SAT)

时间:2015-12-18 10:32:32      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

 

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18511

 

【思路】

       2-SAT。

       设分得A或B类任务为1 C类任务为0,考虑互相讨厌的两人:如果年龄阶段相同,则需要满足a!=b,即(a==1 or b==1)=1 && (a==0 or b==0)=1,如果年龄阶段不同,则需要满足ab不同时为C,即(a==1 or b==1)=1。

 

【代码】

 1 #include<cstdio>
 2 #include<vector>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 
 9 const int maxn = 100000+10;
10 
11 struct TwoSAT {
12     int n;
13     vector<int> G[maxn*2];
14     bool mark[maxn*2];
15     int S[maxn*2],c;
16     
17     void init(int n) {
18         this->n=n;
19         for(int i=0;i<n*2;i++) G[i].clear();
20         memset(mark,0,sizeof(mark));
21     }
22     void addc(int x,int xval,int y,int yval) {
23         x=x*2+xval;
24         y=y*2+yval;
25         G[x^1].push_back(y);
26         G[y^1].push_back(x);
27     }
28     bool dfs(int x) {
29         if(mark[x^1]) return false;
30         if(mark[x]) return true;
31         mark[x]=true;
32         S[c++]=x;
33         for(int i=0;i<G[x].size();i++)
34             if(!dfs(G[x][i])) return false;
35         return true;
36     }
37     bool solve() {
38         for(int i=0;i<n*2;i+=2)
39             if(!mark[i] && !mark[i+1]) {
40                 c=0;
41                 if(!dfs(i)) {
42                     while(c>0) mark[S[--c]]=false;
43                     if(!dfs(i+1)) return false;
44                 }
45             }
46         return true;
47     }
48 }ts;
49 
50 int n,m;
51 int a[maxn];
52 
53 int main() {
54     while(scanf("%d%d",&n,&m)==2 && n) {
55         int u,v,x=0;
56         for(int i=0;i<n;i++) scanf("%d",&a[i]),x+=a[i];
57         ts.init(n);
58         for(int i=0;i<m;i++) {
59             scanf("%d%d",&u,&v);
60             u--,v--;
61             int k1=a[u]*n<x? 0:1;
62             int k2=a[v]*n<x? 0:1;
63             if(k1==k2) {
64                 ts.addc(u,1,v,1);
65                 ts.addc(u,0,v,0);
66             }
67             else  ts.addc(u,1,v,1);
68         }
69         if(!ts.solve()) printf("No solution.\n");
70         else
71             for(int i=0;i<n;i++)
72                 if(ts.mark[i*2]) printf("C\n");
73                 else {
74                     if(a[i]*n<x) printf("B\n");
75                     else printf("A\n");
76                 }
77     }
78     return 0;
79 }

 

UVAlive3713 Astronauts(2-SAT)

标签:

原文地址:http://www.cnblogs.com/lidaxin/p/5056115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!