日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 1814 字典序最小的2sat(暴力深搜)

發布時間:2025/6/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1814 字典序最小的2sat(暴力深搜) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?題意就是最基礎的2sat,關系只有矛盾關系,然后二選一,關鍵是這個題目是輸出字典序最小的那組解。

思路:

? ? ?輸出字典序最小,用強連通那個實現不了(起碼沒看到有人實現),其實我們可以直接暴力,我們可以給某個點染色,分成無色(W)紅色(R)和藍色(B)紅色是我們要的答案,對于每一個點我們先盡可能的吧他的a染成紅色,把他的~a染成藍色,如果發現矛盾,就是出現a是藍色的了,那么我們就把當前這個連通塊重新清成W吧其實點換成~a這樣在繼續染色,如果還是不行,那么就證明無解。否則這樣全部染完色之后的紅色點就是我們要的點。時間復雜度是 n * m * 2,大約也就n * m左右。本以為會超時,感覺到億了,結果沒有,1140ms AC ,貌似是有直接求什么字典序最小的固定算法吧!反正有也不會。哎!

#include<stdio.h> #include<string.h> #include<queue>#define N_node 16000 + 100 #define N_edge 40000 + 400 #define W 0 #define R 1 #define B 2 using namespace std;typedef struct {int to ,next; }STAR;STAR E[N_edge]; int list[N_node] ,tot; int col[N_node]; queue<int>q;void add(int a ,int b) {E[++tot].to = b;E[tot].next = list[a];list[a] = tot; }bool DFS(int s) {if(col[s] == B) return 0;if(col[s] == R) return 1;col[s] = R ,col[s^1] = B;q.push(s);for(int k = list[s] ;k ;k = E[k].next)if(!DFS(E[k].to)) return 0;return 1; }bool solve(int n) {memset(col ,W ,sizeof(col));for(int i = 0 ;i < n ;i ++){if(col[i]) continue;while(!q.empty()) q.pop();if(!DFS(i)){while(!q.empty()){col[q.front()] = col[q.front()^1] = W;q.pop();}if(!DFS(i^1)) return 0;}}return 1; }int main () {int n ,m ,i ,a ,b;while(~scanf("%d %d" ,&n ,&m)){memset(list ,0 ,sizeof(list)) ,tot = 1;for(i = 1 ;i <= m ;i ++){scanf("%d %d" ,&a ,&b);a-- ,b--;add(a ,b^1) ,add(b ,a^1);}if(solve(n * 2)){for(i = 1 ;i <= n * 2 ;i ++)if(col[i-1] == R) printf("%d\n" ,i);}else printf("NIE\n");}return 0; }

總結

以上是生活随笔為你收集整理的hdu 1814 字典序最小的2sat(暴力深搜)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。