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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU - 1824 Let's go home

發布時間:2024/3/7 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU - 1824 Let's go home 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Let’s go home

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

Problem Description
小時候,鄉愁是一枚小小的郵票,我在這頭,母親在那頭。
—— 余光中

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

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

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

Sample Input
1 2
0 1 2
0 1
1 2

2 4
0 1 2
3 4 5
0 3
0 4
1 3
1 4

Sample Output
yes
no


一道比較明顯的2-SAT,現在我們主要考慮如何建圖。

考慮建圖:
對于第一種隊伍關系:

  • a走,b,c留
  • b走,c走,a留
  • c走,b走,a留
  • a留,b,c走
  • b留,c留,a走
  • c留,b留,a走
  • 對于第二種關系:

  • a走,b留
  • b走,a留

  • 然后對于每個隊員跑一次tarjan即可,但是這道題并沒有說隊員是連續的,而是說每個隊員有編號,所以我們要用map來離散化每個隊員的編號。但是好像這道題數據比較水,不離散化,當成編號連續也能AC

    然后檢查每個隊員,如果這個隊員走和這個隊員留在同一個強連通分量當中,就輸出no,不然輸出yes


    AC代碼:

    #pragma GCC optimize(2) #include<bits/stdc++.h> //#define int long long using namespace std; const int N=10010,M=100010; int n,m,dfn[N],col[N],low[N],vis[N],cnt,co,base,flag,idx; int head[N],nex[M],to[M],tot; stack<int> st; unordered_map<int,int> mp; inline void add(int a,int b){to[++tot]=b; nex[tot]=head[a]; head[a]=tot; } inline void init(){memset(head,0,sizeof head); memset(dfn,0,sizeof dfn);memset(low,0,sizeof low); memset(col,0,sizeof col);cnt=co=tot=flag=idx=0; mp.clear(); } void tarjan(int x){dfn[x]=low[x]=++cnt; st.push(x); vis[x]=1;for(int i=head[x];i;i=nex[i]){if(!dfn[to[i]]){tarjan(to[i]); low[x]=min(low[x],low[to[i]]);}else if(vis[to[i]]) low[x]=min(low[x],dfn[to[i]]);}if(dfn[x]==low[x]){co++;while(1){int u=st.top(); st.pop(); vis[u]=0;col[u]=co; if(u==x) return ;}} } signed main(){while(~scanf("%d %d",&n,&m)){init(); base=3*n;for(int i=1;i<=n;i++){int a,b,c; scanf("%d %d %d",&a,&b,&c);mp[a]=++idx; mp[b]=++idx; mp[c]=++idx;add(mp[a]+base,mp[b]); add(mp[a]+base,mp[c]);add(mp[b]+base,mp[a]); add(mp[b]+base,mp[c]+base);add(mp[c]+base,mp[a]); add(mp[c]+base,mp[b]+base);add(mp[a],mp[b]+base); add(mp[a],mp[c]+base);add(mp[b],mp[a]+base); add(mp[b],mp[c]);add(mp[c],mp[a]+base); add(mp[c],mp[b]);}while(m--){int a,b; scanf("%d %d",&a,&b);add(mp[a],mp[b]+base); add(mp[b],mp[a]+base); }for(int i=1;i<=6*n;i++) if(!dfn[i]) tarjan(i);for(int i=1;i<=base&&!flag;i++) if(col[i]==col[i+base]) flag++;puts(flag?"no":"yes");}return 0; }

    總結

    以上是生活随笔為你收集整理的HDU - 1824 Let's go home的全部內容,希望文章能夠幫你解決所遇到的問題。

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