HDU 3622 2-sat+二分

点击打开链接

题意:给了n个点对,每一对只能引爆其中一个,然后所有的点的爆炸半径是一样的,然后要求所有的点的爆炸范围不相交,问爆炸半径最大是多少

思路:二分半径的大小,然后判断条件就用2-sat就可以,对于点对A和B,若A和B不能共存,即A,B不能同时取,连边,然后每次判断就可以了,二分可以用精度来做,也可以二分多次已达到结果

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int maxn=410;
int n,m;
vectorG[maxn],rG[maxn],vs;
bool used[maxn];
int cmp[maxn],X1[maxn],Y1[maxn],X2[maxn],Y2[maxn];
void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
}
void dfs(int v){
    used[v]=1;
    for(unsigned int i=0;i=0;i--){
        if(!used[vs[i]]) rdfs(vs[i],sum++);
    }
    return sum;
}
//A,B不能同时取  
bool judge(double mid){
    for(int i=0;i<2*n;i++) G[i].clear(),rG[i].clear();
    for(int i=0;i

你可能感兴趣的:(图论,二分,强联通分量)