[cf1215F]Radio Stations

这道题如果没有功率的限制,显然就是一个裸的2-sat
考虑将功率的限制也放在图上:如果选择了功率i,那么功率区间不包含它的点只能不选,连边即可
但是这样建图的边数是o(n^2),需要优化
将功率区间分为两种,一种在这个点前面,另一种在这个点的后面
同样将功率也裂成两个点,分别连向这两种区间,显然功率i的第1种点一定是功率i+1的第一种点的子集,因此直接(i+1)1->i1就可以了,同理(i-1)2->i2

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     scanf("%d%d%d%d",&m1,&n,&m,&m2);
 5     for(int i=1;i<=m1;i++){
 6         scanf("%d%d",&x,&y);
 7         add(2*x-1,2*y);
 8         add(2*y-1,2*x);
 9     }
10     for(int i=1;i<=n;i++){
11         scanf("%d%d",&x,&y);
12         add(2*n+2*x,2*i-1);
13         add(2*n+2*y-1,2*i-1);
14     }
15     for(int i=1;i<=m2;i++){
16         scanf("%d%d",&x,&y);
17         add(2*x,2*y-1);
18         add(2*y,2*x-1);
19     }
20     for(int i=1;i<=p;i++){
21         if (i<p)add(2*n+2*i-1,2*n+2*i+1);
22         if (1<i)add(2*n+2*i,2*n+2*i+2);
23     }
24     
25 }
View Code

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11538332.html