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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

poj2912(带权并查集+枚举)

發布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj2912(带权并查集+枚举) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://poj.org/problem?id=2912

題意:給n個人,m組關系,玩石頭剪刀布的游戲,n個人中除一個人judge以外,其他人屬于3個group(即石頭、剪刀、布),他們只能出這一個手勢,而judge可以隨便出,要求能否找到judge和在第幾組關系時能最先找到judge。

思路:poj1182食物鏈的進階版,與那題不同的是,這里需要枚舉0到n-1,枚舉i假設其為judge,然后遍歷不包含i的所有關系,如果符合條件,則i就是judge,否則其不是judge,記錄其判斷出不是judge的那條邊line(后面要用),遍歷結束之后,如果judge數目num<1,則Impossible,若num>1,則Can not determine,若num=1,則其為judge,但需要輸出判斷其為judge的最小的line,其實也就是其它非judge判斷為非judge的邊line的最大值,這里有點巧妙。

   其余的就和食物鏈一樣了,x->y=-1(<),0(=),1(>),且 x->z=(x->y+y->z+4)%3-1,公式自己手動算一下就明白了。

AC代碼:

1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 5 struct node{ 6 int x,y; 7 char c; 8 }a[2005]; 9 10 int n,m,root[505],f[505],ans[505],res,num; 11 12 int getr(int k){ 13 if(root[k]==k) return k; 14 else{ 15 int tmp=root[k]; 16 root[k]=getr(root[k]); 17 f[k]=(f[k]+f[tmp]+4)%3-1; 18 return root[k]; 19 } 20 } 21 22 int main(){ 23 while(~scanf("%d%d",&n,&m)){ 24 if(!m){ 25 if(n==1) 26 printf("Player 0 can be determined to be the judge after 0 lines\n"); 27 else 28 printf("Can not determine"); 29 continue; 30 } 31 memset(ans,0,sizeof(ans)); 32 num=0; 33 for(int i=1;i<=m;++i) 34 scanf("%d%c%d",&a[i].x,&a[i].c,&a[i].y); 35 for(int i=0;i<n;++i){ 36 bool flag=true; 37 for(int j=0;j<n;++j) 38 root[j]=j,f[j]=0; 39 for(int j=1;j<=m;++j){ 40 if(a[j].x!=i&&a[j].y!=i){ 41 int t1=a[j].x,t2=a[j].y,t3,r1,r2; 42 if(a[j].c=='<') t3=-1; 43 else if(a[j].c=='=') t3=0; 44 else t3=1; 45 r1=getr(t1),r2=getr(t2); 46 if(r1==r2){ 47 if(f[t1]!=(t3+f[t2]+4)%3-1){ 48 ans[i]=j; 49 flag=false; 50 break; 51 } 52 } 53 else{ 54 root[r2]=r1; 55 f[r2]=(-((t3+f[t2]+4)%3-1)+f[t1]+4)%3-1; 56 } 57 } 58 } 59 if(flag) 60 ++num,res=i; 61 } 62 if(num<1) 63 printf("Impossible\n"); 64 else if(num>1) 65 printf("Can not determine\n"); 66 else{ 67 int Max=0; 68 for(int i=0;i<n;++i) 69 if(ans[i]>Max) 70 Max=ans[i]; 71 printf("Player %d can be determined to be the judge after %d lines\n",res,Max); 72 } 73 } 74 return 0; 75 }

?

轉載于:https://www.cnblogs.com/FrankChen831X/p/10659338.html

總結

以上是生活随笔為你收集整理的poj2912(带权并查集+枚举)的全部內容,希望文章能夠幫你解決所遇到的問題。

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