青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 43,  comments - 9,  trackbacks - 0
二分圖匹配的巧妙應用
相當巧妙!
CTU 2005 Open
http://acm.pku.edu.cn/JudgeOnline/problem?id=2990

題意:
8*8的棋盤, 初始放置2個相同的棋子. Alice和Bob輪流行動. 每次行動可以把其中一個棋子移到它上下左右相鄰格內(某些格子壞掉了,則不能移). 當某人的移動使兩棋子重合時, 他贏. 另, 一局中不能出現重復的局面. 比如(0,0)(4,0) -> (1,0)(4,0)合法, 此時如果再(1,0)(4,0) -> (0,0)(4,0)則非法. 當一個人無子可動時, 他輸.
兩人都用最優策略. 問先手的Alice必勝還是必敗?

解:
把每個合法狀態看成一個頂點, 則狀態轉移就是向其它點連邊. 這樣建的圖是二分圖.
而兩人下棋, 就是在圖上以初始狀態的頂點為起點, 沿邊移動. 由于建的圖是由所有合法狀態與合法移動組成的, 因此, 移動到哪個集合(A與B), 就表示輪到誰行動. 當無法再移動時, 點在哪個集合就表示對應的人輸了.
狀態不重復出現, 表示移動路徑沒有環.
誰贏誰輸, 與路徑長度的奇偶性密切相關.
考慮二分圖的最大匹配, 也是個找交替路徑擴張的過程.

設起點為v, 分情況討論v的狀態與路徑長度的關系:

(1) v是自由點. 這表示v的任意鄰接點vB都是浸潤點. 不管選哪個vB, 都可以沿著它的匹配邊走到vA'. 只要Bob每次都沿匹配邊走, 由于不可能達到另一個自由點, 因此終點必屬于A, Bob必勝.

(2) v是浸潤點, 此時v所在的交替路徑兩個端點分布情況可能有幾種:
    a)對所有交替路徑, 端點都在B集. 這時只要Alice每次都沿著匹配邊走, 必勝.
    b)存在一條交替路徑, 端點都在A集. 把沿v的匹配邊走的那一半全部置反, 就變成(1)的狀態了, 因此2者等價.
    c)沿v的匹配邊走的那一半全終止于B, 另一半終止于A. 只要Alice一開始就沿匹配邊走, 后面策略同a.
    其它情形不可能在最大匹配中出現, 故不討論. 這正是充分利用了最大匹配的性質.

因此對本題先求最大匹配, 然后判斷是否為(1)或(2b), 即可知勝負.

代碼如下:

  1 #include <iostream>
  2 using namespace std;
  3 
  4 const int MAX_VERT = (1<<12)+1;
  5 const int MAX_EDGE = MAX_VERT * 16;
  6 struct EDGE{
  7     int v,e;
  8 }edg[ MAX_EDGE ];
  9 int se, gg[ MAX_VERT ], nv;
 10 int start;
 11 int mat[ MAX_VERT ];
 12 bool ok[ MAX_VERT ], vis[ MAX_VERT ];
 13 
 14 int N,M;
 15 char bo[20][20];
 16 
 17 bool chkpt(int x, int y)
 18 {
 19     if(x<0 || x>=|| y<0 || y>=N) return false;
 20     if(bo[y][x]=='#'return false;
 21     return true;
 22 }
 23 
 24 //判斷合法狀態 
 25 bool chksta(int x1, int y1, int x2, int y2)
 26 {
 27     if(!chkpt(x1,y1) || !chkpt(x2,y2)) return false;
 28     if(abs(x1-x2)+abs(y1-y2)<=1return false;
 29     return true;
 30 }
 31 
 32 //位壓縮存狀態 
 33 int encode(int x1, int y1, int x2, int y2) 
 34 {
 35     if(y1 > y2 || (y1==y2 && x1 > x2)) //小點放前面, 避免重復狀態 
 36         swap(y1,y2), swap(x1,x2);
 37     int v = x1;
 38     v = (v<<3| y1;
 39     v = (v<<3| x2;
 40     v = (v<<3| y2;
 41     return v;
 42 }
 43 
 44 inline void addedge(int u, int v)
 45 {
 46     edg[se].v = v;
 47     edg[se].e = gg[u];
 48     gg[u] = se++;
 49 }
 50 
 51 void addmove(int u, int x1, int y1, int x2, int y2)
 52 {
 53     if(!chksta(x1, y1, x2, y2)) return ;
 54     int v = encode(x1, y1, x2, y2);
 55     addedge(u, v);
 56 }
 57 
 58 //添加狀態轉移的邊 
 59 void gene(int x1, int y1, int x2, int y2)
 60 {
 61     if(!chksta(x1,y1,x2,y2)) return;
 62     int u = encode(x1,y1,x2,y2);
 63     ok[u] = true;
 64     mat[u] = -1;
 65     addmove(u, x1+1, y1, x2, y2);
 66     addmove(u, x1-1, y1, x2, y2);
 67     addmove(u, x1, y1+1, x2, y2);
 68     addmove(u, x1, y1-1, x2, y2);
 69     addmove(u, x1, y1, x2+1, y2);
 70     addmove(u, x1, y1, x2-1, y2);
 71     addmove(u, x1, y1, x2, y2+1);
 72     addmove(u, x1, y1, x2, y2-1);
 73 }
 74 
 75 //建圖 
 76 void input()
 77 {
 78     int x1, y1, x2, y2;
 79     
 80     for(y1=0; y1<N; y1++)
 81         scanf("%s",bo[y1]);
 82         
 83     se = 1;
 84     memset(gg,0,sizeof(gg));
 85     nv = M << 9;
 86     memset(ok, falsesizeof(ok));
 87     memset(mat, 0xffsizeof(mat));
 88     memset(vis, falsesizeof(vis));
 89     
 90     int c=0, tx[2],ty[2];
 91     for(y1=0; y1<N; y1++){
 92         for(x1=0; x1<M; x1++){
 93             if(bo[y1][x1] == 'P')
 94                 tx[c]=x1, ty[c]=y1, c++;
 95             for(x2=x1+1; x2<M; x2++)
 96                 gene(x1,y1,x2,y1);
 97             for(y2=y1+1; y2<N; y2++)
 98                 for(x2=0; x2<M; x2++)
 99                     gene(x1,y1,x2,y2);
100         }
101     }
102     start = encode(tx[0], ty[0], tx[1], ty[1]);
103 }
104 
105 bool hungrey(int r)
106 {
107     //這個匹配函數不分XY集, 因此匹配點雙方的mat標記都要修改 
108     int i,j,k;
109     vis[r] = true;
110     for(j=gg[r]; j>0; j=edg[j].e){
111         int v = edg[j].v;
112         if(!vis[v]){
113             vis[v] = true;
114             if(mat[v]==-1 || hungrey(mat[v])){
115                 mat[v] = r;
116                 mat[r] = v;
117                 return true;
118             }
119         }
120     }
121     return false;
122 }
123 
124 int main()
125 {
126     int i,j,k;
127     while(scanf("%d %d",&N,&M)!=EOF){
128         input();
129         if!ok[start] ){
130             puts("Alice wins.");
131             continue;
132         }
133         
134         for(i=0; i<nv; i++){
135             memset(vis, falsesizeof(vis));
136             if( mat[i]==-1 ) hungrey(i);
137         }
138         if( mat[start]!=-1 ){ //判斷是否是(2b)并轉化為(1) 
139             memset(vis, falsesizeof(vis));
140             vis[start] = true;
141             if(hungrey(mat[start]))
142                 mat[start] = -1;
143         }
144         
145         if( mat[start]!=-1 )
146             puts("Alice wins.");
147         else
148             puts("Bob wins.");
149     }
150     return 0;
151 }
152 


posted on 2009-07-06 11:55 wolf5x 閱讀(386) 評論(0)  編輯 收藏 引用 所屬分類: acm_icpc
<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

"Do not spend all your time on training or studying - this way you will probably become very exhausted and unwilling to compete more. Whatever you do - have fun. Once you find programming is no fun anymore – drop it. Play soccer, find a girlfriend, study something not related to programming, just live a life - programming contests are only programming contests, and nothing more. Don't let them become your life - for your life is much more interesting and colorful." -- Petr

留言簿(3)

隨筆分類(59)

隨筆檔案(43)

cows

搜索

  •  

最新評論

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            伊人久久大香线蕉综合热线| 欧美伊人久久大香线蕉综合69| 亚洲精品国偷自产在线99热| 亚洲春色另类小说| 在线欧美一区| 一区二区三区视频在线| 欧美一区二区三区啪啪| 久久久久久高潮国产精品视| 乱人伦精品视频在线观看| 欧美搞黄网站| 日韩亚洲欧美一区| 午夜一区二区三区不卡视频| 久久亚洲图片| 欧美视频日韩视频| 国产专区精品视频| 日韩亚洲欧美一区| 久久丁香综合五月国产三级网站| 欧美高清在线视频| 亚洲天堂久久| 免费观看成人网| 国产精品手机视频| 亚洲国语精品自产拍在线观看| 亚洲午夜激情| 欧美激情久久久久| 欧美一区二区视频97| 欧美日韩理论| 亚洲电影自拍| 欧美尤物一区| 亚洲精选中文字幕| 狂野欧美一区| 国产亚洲精品激情久久| 亚洲毛片av在线| 美女91精品| 亚洲欧美国产一区二区三区| 欧美精品激情在线| 亚洲国产成人在线播放| 久久大香伊蕉在人线观看热2| 亚洲黄色一区二区三区| 亚洲色无码播放| 欧美国产另类| 亚洲国产你懂的| 久久午夜精品| 欧美一级成年大片在线观看| 国产精品免费一区豆花| 夜夜爽99久久国产综合精品女不卡| 久久久久久午夜| 亚洲免费视频一区二区| 欧美午夜精品久久久久久孕妇| 99国内精品久久| 黄色一区二区在线观看| 99精品视频免费全部在线| 久久一区二区三区四区五区| 在线午夜精品自拍| 欧美日韩国产综合在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久尤物电影视频在线观看| 亚洲欧美不卡| 国产精品久久久久免费a∨| 亚洲视频999| 在线中文字幕日韩| 欧美系列亚洲系列| 亚洲天堂成人在线视频| 一区二区三区高清在线观看| 欧美系列亚洲系列| 午夜在线一区| 午夜性色一区二区三区免费视频 | 亚洲欧洲在线观看| 亚洲高清自拍| 欧美日韩国产在线观看| 亚洲欧美日韩中文播放| 亚洲一区欧美二区| 黄色精品一区| 亚洲日本一区二区三区| 欧美午夜精品久久久久免费视| 亚洲私人影院| 亚洲影院在线观看| 伊人一区二区三区久久精品| 欧美激情视频在线播放| 欧美日韩三区四区| 欧美一区亚洲二区| 久久久久久亚洲精品不卡4k岛国| 一区二区在线免费观看| 亚洲电影有码| 国产精品女人网站| 免费欧美日韩国产三级电影| 欧美精品在线免费播放| 香蕉精品999视频一区二区| 久久精品论坛| 亚洲一二三四区| 久久久人成影片一区二区三区观看 | 欧美风情在线观看| 欧美日韩免费| 六月天综合网| 国产精品人人做人人爽| 男女激情久久| 国产精品二区在线| 蜜桃av一区二区| 欧美私人网站| 欧美成ee人免费视频| 国产精品成人免费| 欧美成人福利视频| 国产精品美女久久久免费 | 国产精品自拍小视频| 另类综合日韩欧美亚洲| 欧美视频一二三区| 欧美激情国产高清| 国产欧美一区二区精品秋霞影院| 欧美成人精品在线视频| 国产精品欧美久久| 亚洲精品视频在线观看网站| 韩国av一区二区| 亚洲精品在线一区二区| 亚洲国产成人精品久久| 午夜伦欧美伦电影理论片| 亚洲一区二区精品在线观看| 欧美成人a视频| 欧美国产日韩xxxxx| 很黄很黄激情成人| 先锋资源久久| 欧美亚洲网站| 国产精品欧美久久| 9色精品在线| 亚洲天堂免费在线观看视频| 欧美黑人一区二区三区| 亚洲国产精品国自产拍av秋霞| 黄色亚洲大片免费在线观看| 午夜欧美精品| 久久精品国产精品亚洲综合| 国产日韩一级二级三级| 午夜性色一区二区三区免费视频 | 欧美福利在线| 亚洲电影免费在线| 久久精视频免费在线久久完整在线看| 午夜久久一区| 国产欧美婷婷中文| 午夜精品久久久久久久久久久久| 亚洲愉拍自拍另类高清精品| 欧美午夜精品| 亚洲欧美国产日韩中文字幕| 欧美在线视频播放| 国外精品视频| 久久综合伊人77777| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美成人免费视频| 亚洲夫妻自拍| 欧美激情亚洲综合一区| 91久久夜色精品国产九色| 99精品99| 国产欧美精品日韩精品| 久久久午夜精品| 亚洲日本精品国产第一区| 一区二区冒白浆视频| 国产精品久久国产精麻豆99网站| 亚洲一区免费| 美女视频黄a大片欧美| 亚洲精品在线观看视频| 欧美视频在线免费看| 午夜精品久久久久久久99樱桃 | 久久久人成影片一区二区三区观看| 欧美午夜剧场| 午夜精品视频| 欧美大片一区二区| 99这里只有久久精品视频| 欧美日韩在线播放一区| 亚洲欧美一区二区精品久久久| 久久亚裔精品欧美| 一区二区三区欧美| 国语自产精品视频在线看抢先版结局| 久久久国产91| 一区二区三区四区五区精品视频| 欧美一级淫片aaaaaaa视频| 亚洲电影免费观看高清| 国产精品久久久久久户外露出| 久久国产福利| 一区二区成人精品| 欧美高清视频在线| 欧美在线亚洲| 日韩一区二区免费高清| 国外精品视频| 国产精品日韩在线观看| 奶水喷射视频一区| 欧美与欧洲交xxxx免费观看 | 久久综合中文字幕| 亚洲一区二区在线视频| 亚洲国产岛国毛片在线| 国产精品永久在线| 欧美日韩裸体免费视频| 麻豆国产va免费精品高清在线| 亚洲桃色在线一区| 亚洲每日在线| 亚洲国产日韩欧美在线图片| 久久天堂av综合合色| 午夜电影亚洲| 中国成人亚色综合网站| 亚洲欧洲精品一区二区| 影音先锋亚洲电影| 狠狠操狠狠色综合网| 国产日韩欧美在线播放| 国产精品久久久久久久久久久久久久 |