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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu1824 基础2sat

發(fā)布時(shí)間:2025/6/17 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu1824 基础2sat 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題意:

Let's go home

Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1358 Accepted Submission(s): 522


Problem Description 小時(shí)候,鄉(xiāng)愁是一枚小小的郵票,我在這頭,母親在那頭。
—— 余光中

集訓(xùn)是辛苦的,道路是坎坷的,休息還是必須的。經(jīng)過一段時(shí)間的訓(xùn)練,lcy決定讓大家回家放松一下,但是訓(xùn)練還是得照常進(jìn)行,lcy想出了如下回家規(guī)定,每一個(gè)隊(duì)(三人一隊(duì))或者隊(duì)長留下或者其余兩名隊(duì)員同時(shí)留下;每一對隊(duì)員,如果隊(duì)員A留下,則隊(duì)員B必須回家休息下,或者B留下,A回家。由于今年集訓(xùn)隊(duì)人數(shù)突破往年同期最高記錄,管理難度相當(dāng)大,lcy也不知道自己的決定是否可行,所以這個(gè)難題就交給你了,呵呵,好處嘛~,免費(fèi)**漂流一日。

Input 第一行有兩個(gè)整數(shù),T和M,1<=T<=1000表示隊(duì)伍數(shù),1<=M<=5000表示對數(shù)。
接下來有T行,每行三個(gè)整數(shù),表示一個(gè)隊(duì)的隊(duì)員編號,第一個(gè)隊(duì)員就是該隊(duì)隊(duì)長。
然后有M行,每行兩個(gè)整數(shù),表示一對隊(duì)員的編號。
每個(gè)隊(duì)員只屬于一個(gè)隊(duì)。隊(duì)員編號從0開始。

Output 可行輸出yes,否則輸出no,以EOF為結(jié)束。

Sample Input 1 2 0 1 2 0 1 1 22 4 0 1 2 3 4 5 0 3 0 4 1 3 1 4
Sample Output yes no

思路:
? ? ? 基礎(chǔ)的2sat,不會的建議看根據(jù)對稱性解析2sat的那個(gè) ,把隊(duì)長和兩個(gè)隊(duì)員看成基本的一對,然后再把排斥的那個(gè)看成排斥的一對,輸入的時(shí)候記得吧兩個(gè)隊(duì)員hash成一個(gè)人就行了。


#include<stdio.h> #include<string.h> #include<stack>#define N_node 30000 + 100 #define N_edge 50000 + 100 using namespace std;typedef struct {int to ,next; }STAR;STAR E1[N_edge] ,E2[N_edge]; int list1[N_node] ,list2[N_node] ,tot; int Belong[N_node] ,cnt; int mark[N_node] ,id[N_node]; stack<int>st;void add(int a ,int b) {E1[++tot].to = b;E1[tot].next = list1[a];list1[a] = tot;E2[tot].to = a;E2[tot].next = list2[b];list2[b] = tot; }void DFS1(int s) {mark[s] = 1;for(int k = list1[s] ;k ;k = E1[k].next){int xin = E1[k].to;if(!mark[xin]) DFS1(xin);}st.push(s); }void DFS2(int s) {mark[s] = 1;Belong[s] = cnt;for(int k = list2[s] ;k ;k = E2[k].next){int xin = E2[k].to;if(!mark[xin]) DFS2(xin);} }int main () {int n ,m ,i ,a ,b ,c;while(~scanf("%d %d" ,&n ,&m)){for(i = 0 ;i < n ;i ++){scanf("%d %d %d" ,&a ,&b ,&c);id[a] = i * 2;id[b] = id[c] = i * 2 + 1;}memset(list1 ,0 ,sizeof(list1));memset(list2 ,0 ,sizeof(list2));tot = 1;for(i = 1 ;i <= m ;i ++){scanf("%d %d" ,&a ,&b);add(id[a] ,id[b]^1);add(id[b] ,id[a]^1);}memset(mark ,0 ,sizeof(mark));while(!st.empty())st.pop();for(i = 0 ;i < n * 2 ;i ++)if(!mark[i]) DFS1(i);memset(mark ,0 ,sizeof(mark));cnt = 0;while(!st.empty()){int xin = st.top();st.pop();if(mark[xin]) continue;++cnt;DFS2(xin);}int mk = 0;for(i = 0 ;i < n * 2 ;i += 2){if(Belong[i] == Belong[i^1])mk = 1;}mk ? puts("no") : puts("yes");}return 0; }


總結(jié)

以上是生活随笔為你收集整理的hdu1824 基础2sat的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。