題意:某人要去乙個地方救朋友。已知他有n對鑰匙,一共2n把。要求每對鑰匙只能選一把來用。有m個門,每個門有2把鎖,只要開啟其中的一把鎖就能開啟這個門。見到門的順序和輸入一致。給定鑰匙資訊以及每扇門上的兩把鎖的資訊,問如何選擇鑰匙能夠開啟最多的門。
思路:因為有2n把不同鑰匙,所以圖的節點有4n個。如果輸入的鑰匙資訊為(a,b),那麼新增邊a->b+2n;b->a+2n。表示如果帶上了a鑰匙,那麼一定不能帶b;反之亦然;
對於給出的門的資訊(a,b)這樣新增邊:a+2n->b;b+2n->a。表示如果沒有帶上a鑰匙,那麼一定要帶上b鑰匙;反之亦然。接著就是建圖tarjan,二分答案……
#include #include #define min(a,b) ((a)<(b)?(a):(b))
#define clc(a) memset(a,0,sizeof(a))
#define n 1030
#define m 2050
struct pairkey[n],door[m];
struct edgee[(n+m)<<1];
int first[4*n],strong[4*n],dfn[4*n],low[4*n],stack[4*n];
int n,m,top,tops,id,num;
void init()
void add(int x,int y)
void tarjan(int x)else if(!strong[y])
low[x] = min(low[x],dfn[y]);
} if(dfn[x] == low[x])while(stack[tops--]!=x); }}
int main()else
high = mid-1;
} printf("%d\n",res);
} return 0;
}
poj2723 2sat判斷解 二分
典型的2 sat問題,題意 有m個門,每個門上倆把鎖,開啟其中一把即可,現在給n對鑰匙 所有 鑰匙編號0123456.2n 1 每對鑰匙只能用一把,要求盡可能開門多 按順序,前max個 關鍵是題意的分析與轉化,只能選一?必然2 sat,每給一對門上的鎖對應鑰匙的編號,說 必需要這 倆把鑰匙的一把 至...
POJ3648 2SAT解的求得
include include include include include include using namespace std const int nn 100 const int mm 1000 struct twosat void addedge int u,int v void tar...
POJ3648 2 sat強連通縮點法
題意 有一對新人結婚,邀請n對夫婦去參加婚禮。有一張很長的桌子,人只能坐在桌子的兩邊,還要滿足下面的要求 1.每對夫婦不能坐在同一側 2.n對夫婦之中可能有通姦關係 包括男男,男女,有通姦關係的不能同時坐在新娘的對面,可以分開坐,可以同時坐在新娘這一側。如果存在一種可行的方案,輸出與新娘同側的人。解...