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

A Za, A Za, Fighting...

堅(jiān)信:勤能補(bǔ)拙

PKU 3687 Labeling Balls

問題:
http://acm.pku.edu.cn/JudgeOnline/problem?id=3687

思路:
這題理解起來就很困難,等理解透了也還是不會

參考:
http://hi.baidu.com/archersfate/blog/item/30e66f76734a0c12b051b9ab.html

總結(jié):
逆向的拓?fù)渑判颍韧趯D(zhuǎn)置圖進(jìn)行正向的拓?fù)渑判颍ㄆ鋵?shí)就是入度與出度的區(qū)別)
DFS實(shí)現(xiàn)拓?fù)渑判蜻m合于求出所有可能的解
BFS實(shí)現(xiàn)拓?fù)渑判蜻m合于求出滿足特定要求的解


代碼:
 1 /* cpp: priority_queue */
 2 #include<iostream>
 3 #include<queue>
 4 #include<vector>
 5 #include<functional>
 6 #include<cstdio>
 7 #include<cstring>
 8 using namespace std;
 9 
10 #define MAX_N 201
11 int n, m;
12 int adj[MAX_N][MAX_N];
13 int out_degree[MAX_N], topo[MAX_N], ans[MAX_N];
14 
15 void
16 init()
17 {
18     int i, pre, suc;
19     memset(adj, 0sizeof(adj));
20     memset(out_degree, 0sizeof(out_degree));
21     scanf("%d %d"&n, &m);
22     for(i=0; i<m; i++) {
23         scanf("%d %d"&pre, &suc);
24         if(!adj[pre][suc]) { /* avoid duplicates */
25             adj[pre][suc] = 1;
26             ++out_degree[pre];
27         }
28     }
29 }
30 
31 void
32 reverse_topo_sort()
33 {
34     int i, tmp, count = 0;
35     priority_queue<int, vector<int>, less<int> > Q;
36     for(i=1; i<=n; i++)
37         if(out_degree[i] == 0)
38             Q.push(i);
39     while(!Q.empty()) { /* BFS */
40         tmp = Q.top();
41         Q.pop();
42         topo[++count] = tmp;
43         for(i=1; i<=n; i++)
44             if(adj[i][tmp]) {
45                 --out_degree[i];
46                 if(!out_degree[i])
47                     Q.push(i);
48             }
49     }
50     if(count != n) { /* not DAG */
51         printf("-1\n");
52         return;
53     }
54     for(i=1; i<=n; i++)
55         ans[topo[n-i+1]] = i;
56     for(i=1; i<=n; i++)
57         printf("%d ", ans[i]);
58     printf("\n");
59 }
60 
61 int
62 main(int argc, char **argv)
63 {
64     int tests;
65     scanf("%d"&tests);
66     while(tests--) {
67         init();
68         reverse_topo_sort();
69     }
70 }

轉(zhuǎn)載:
   PKU 3687 在基本的拓?fù)渑判虻幕A(chǔ)上又增加了一個要求:編號最小的節(jié)點(diǎn)要盡量排在前面;在滿足上一個條件的基礎(chǔ)上,編號第二小的節(jié)點(diǎn)要盡量排在前面;在滿足前兩個條件的基礎(chǔ)上,編號第三小的節(jié)點(diǎn)要盡量排在前面……依此類推。(注意,這和字典序是兩回事,不可以混淆。)

    如圖 1 所示,滿足要求的拓?fù)湫驊?yīng)該是:6 4 1 3 9 2 5 7 8 0。



圖 1 一個拓?fù)渑判虻睦?/div>
    一般來說,在一個有向無環(huán)圖中,用 BFS 進(jìn)行拓?fù)渑判蚴潜容^常見的
做法
做法,如算法 1 所示。但是它不一定能得到本題要求的拓?fù)湫颉?br style="line-height: normal; ">
1. 把所有入度為 0 的節(jié)點(diǎn)放進(jìn)隊(duì)列 Q
2. WHILE: Q 不是空隊(duì)列
3.     從 Q 中取出隊(duì)列首元素 a,把 a 添加到答案的尾部
4.     FOR:所有從 a 出發(fā)的邊 a → b
5.         把 b 的入度減 1。如果 b 的入度變?yōu)?0,則把 b 放進(jìn)隊(duì)列 Q。

算法 1 用 BFS 進(jìn)行拓?fù)渑判?/div>
    為了解決本問題,下面讓我來探究一下拓?fù)湫虻囊恍┬再|(zhì)。以圖 1 為例,節(jié)點(diǎn) 0 毫無疑問排在最后。除了節(jié)點(diǎn) 0 以外,有三條互相平行的路徑:6 → 4 → 1、 3→ 9 → 2 和 5 → 7 → 8。一條路徑上的各個節(jié)點(diǎn)的先后關(guān)系都是不能改變的,比如路徑 6 → 4 → 1 上的三個節(jié)點(diǎn)在拓?fù)湫蛑校欢ㄊ?nbsp;6 在最前,1 在最后。但是,互相平行的各條路徑,在總的拓?fù)湫蛑?strong style="line-height: normal; ">任意交錯都是合法的。比如,以下都是圖 1 的合法拓?fù)湫颍?br style="line-height: normal; ">
    6 4 1 3 9 2 5 7 8 0、 3 6 9 4 5 1 7 8 2 0、 5 6 4 7 3 8 1 9 2 0、 3 5 6 4 1 7 9 2 8 0、 6 5 7 8 4 3 9 2 1 0。

    怎么才能找出題目要求的拓?fù)湫蚰兀吭谶@里,我想用字典序最先的拓?fù)湫騺硪鲞@個算法。算法 2 可以求出字典序最先的拓?fù)湫颉?br style="line-height: normal; ">
1. 把所有入度為 0 的節(jié)點(diǎn)放進(jìn)優(yōu)先隊(duì)列 PQ
2. WHILE: PQ 不是空隊(duì)列
3. 從 PQ 中取出編號最小的元素 a,把 a 添加到答案的尾部
4. FOR:所有從 a 出發(fā)的邊 a → b
5. 把 b 的入度減 1。如果 b 的入度變?yōu)?0,則把 b 放進(jìn)優(yōu)先隊(duì)列 PQ。

算法 2 求出字典序最先的拓?fù)湫?/div>
    可見,算法 2 和算法 1 基本一樣,只是把隊(duì)列改成了優(yōu)先隊(duì)列。用它求出的圖 1 的字典序最先的拓?fù)湫驗(yàn)椋?font color="#339900" style="line-height: normal; ">3 5 6 4 1 7 8 9 2 0。但是這顯然不是本題要求的答案,因?yàn)楣?jié)點(diǎn) 1 的位置還不夠靠前。

    算法 2 可以算是一個貪心算法,每一步都找編號最小的節(jié)點(diǎn)。但是對于圖 1 中的三條路徑,頭的編號比較小的,不一定要先出隊(duì)列。正確的步驟應(yīng)該如下:
  1. 節(jié)點(diǎn) 0 的位置是鐵定在最后的,不用考慮。只考慮剩下的三條路徑。
  2. 先找編號最小的,節(jié)點(diǎn) 1。把它和它所在的路徑中位于它前面的節(jié)點(diǎn)全部拿出來。目前的答案是 6 4 1,這樣, 節(jié)點(diǎn) 1 就盡量靠前了。
  3. 再找剩下的節(jié)點(diǎn)中編號最小的,節(jié)點(diǎn) 2。把它和它所在的路徑中位于它前面的節(jié)點(diǎn)全部拿出來。目前的答案是 6 4 1 3 9 2 ,這樣,節(jié)點(diǎn) 2 就盡量靠前了。
  4. 只剩下一條路徑了,只能依次把其中的節(jié)點(diǎn)拿出來。最后答案就是 6 4 1 3 9 2 5 7 8 0。
    顯然,算法 2 的貪心策略對于這個問題是不可行的。不能著眼于每條路徑的頭,而是要找編號最小的節(jié)點(diǎn)在哪條路徑上,優(yōu)先把這條路徑拿出來。但問題在于,在 BFS 的過程中,我們只能看到每條路徑的頭,看不到后面的節(jié)點(diǎn),這該怎么辦呢?

    讓我們換個角度想一想,節(jié)點(diǎn) 3 和 6,應(yīng)該是 6 先出隊(duì)列,因?yàn)楣?jié)點(diǎn) 1 在 6 的后面。這和節(jié)點(diǎn) 3 和 6 的編號大小沒有任何關(guān)系。但是,再看另外兩條路徑的尾部,節(jié)點(diǎn) 2 和 8,可以肯定地說,2 一定先出隊(duì)列,因?yàn)樗鼈兒竺娑紱]有別的節(jié)點(diǎn)了,這個時候完全以這兩個節(jié)點(diǎn)本身的編號大小決定順序。歸納起來就是說,對于若干條平行的路徑,小的頭部不一定排在前面,但是大的尾部一定排在后面。于是,就有了算法 3

1. 把所有出度為 0 的節(jié)點(diǎn)放進(jìn)優(yōu)先隊(duì)列 PQ
2. WHILE: PQ 不是空隊(duì)列
3. 從 PQ 中取出編號最大的元素 a,把 a 添加到答案的頭部
4.     FOR:所有指向 a 的邊 b → a
5.     把 b 的出度減 1。如果 b 的出度變?yōu)?0,則把 b 放進(jìn)優(yōu)先隊(duì)列 PQ。

算法 3 求出本題目要求的拓?fù)湫?/div>
    我覺得這道題目確實(shí)挺奧妙的,我搞了很久才想通算法 3 為什么是正確的,特地在此寫一下。

posted on 2010-09-04 11:35 simplyzhao 閱讀(304) 評論(0)  編輯 收藏 引用 所屬分類: F_圖算法

導(dǎo)航

<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

統(tǒng)計

  • 隨筆 - 209
  • 文章 - 0
  • 評論 - 7
  • 引用 - 0

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲综合欧美| 欧美性开放视频| 日韩视频一区二区三区在线播放| 久久亚洲精品一区二区| 久久久久久久综合日本| 久久gogo国模啪啪人体图| 午夜精品久久久久久久| 欧美综合77777色婷婷| 久久精品欧洲| 欧美国产日韩在线| 亚洲精品视频啊美女在线直播| 国产麻豆9l精品三级站| 国模私拍一区二区三区| 在线日韩中文字幕| 亚洲自拍偷拍麻豆| 久久亚洲综合色| 91久久久久| 中文高清一区| 久久这里有精品视频| 欧美日韩国产精品一区| 国产伦精品一区二区三区视频黑人 | 国产精品大片| 国产午夜精品在线| 亚洲国产欧美日韩另类综合| 欧美韩国日本一区| 国产精品制服诱惑| 久久黄色小说| 国产精品久久久久久久9999| 国内精品久久久久久久影视麻豆 | 久久阴道视频| 亚洲人成在线影院| 欧美一区三区三区高中清蜜桃| 免费一级欧美片在线观看| 国产精品亚洲精品| 一道本一区二区| 欧美二区在线观看| 久久福利资源站| 国产日韩欧美在线观看| 亚洲国产精品嫩草影院| 中文在线资源观看网站视频免费不卡 | 欧美高清影院| 国产精品亚发布| 亚洲激情精品| 久久精品国产视频| 亚洲一区二区三区中文字幕| 欧美88av| 红桃视频国产精品| 久久精品国产一区二区三区| 国产精品99久久久久久久女警| 另类av导航| 国内揄拍国内精品久久| 亚洲欧美日本国产有色| 日韩亚洲欧美高清| 欧美精品一区二区精品网| 亚洲承认在线| 美女性感视频久久久| 欧美一区二区三区在线看| 国产精品久久久久久久久| 一本色道婷婷久久欧美| 亚洲欧洲在线免费| 欧美77777| 亚洲破处大片| 亚洲精品久久在线| 欧美精品在线观看播放| 亚洲午夜免费视频| 亚洲天堂成人在线视频| 国产精品国产三级国产专播品爱网| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美韩国日本综合| 欧美精品日韩一本| 亚洲欧美激情四射在线日| 亚洲精品日韩精品| 国产精品扒开腿做爽爽爽视频| 亚洲综合视频在线| 亚洲欧美日韩中文播放| 国产亚洲一区二区在线观看 | 亚洲欧美文学| 亚洲一区二区三区精品动漫| 国产精品一区在线观看你懂的 | 免费成人激情视频| 亚洲欧美视频| 国内精品视频一区| 久久精品国产99国产精品| 久久大香伊蕉在人线观看热2| 精品动漫一区二区| 免费黄网站欧美| 欧美精品一区二区精品网 | 国产精品萝li| 亚洲免费视频成人| 久久精品国产99精品国产亚洲性色| 狠狠色丁香久久婷婷综合丁香| 亚洲激情在线| 国产农村妇女精品| 另类欧美日韩国产在线| 欧美成人免费在线| 欧美一区二区精品久久911| 美日韩精品视频| 在线天堂一区av电影| 亚洲欧美日韩成人| 亚洲三级视频| 国产精品99久久久久久久久久久久 | 乱中年女人伦av一区二区| 亚洲麻豆国产自偷在线| 亚洲一区二区三区在线播放| 亚洲国产精品悠悠久久琪琪| 亚洲美女啪啪| 国产精品日韩精品欧美在线| 欧美激情久久久久久| 国产精品视频自拍| 欧美二区不卡| 国产亚洲欧洲一区高清在线观看| 亚洲片在线观看| 国产在线精品一区二区夜色| 亚洲最黄网站| 亚洲精品偷拍| 亚洲一区欧美激情| 猛男gaygay欧美视频| 欧美中文字幕久久| 欧美日韩人人澡狠狠躁视频| 美女在线一区二区| 国产一区 二区 三区一级| 亚洲午夜精品网| 在线亚洲欧美| 免费看亚洲片| 老司机午夜精品视频在线观看| 国产欧美日韩另类视频免费观看 | 午夜久久电影网| 欧美日韩在线第一页| 最新国产拍偷乱拍精品| 伊人久久大香线蕉综合热线| 亚洲一区精品视频| 亚洲一区二区三区涩| 欧美激情精品久久久久久大尺度 | 亚洲高清在线播放| 国产一区二区毛片| 欧美国产日韩亚洲一区| 激情综合自拍| 亚洲一区免费视频| 亚洲视频综合| 欧美日韩国产页| 国产精品免费一区二区三区在线观看 | 欧美高清在线视频| 在线观看视频免费一区二区三区| 亚洲桃花岛网站| 欧美日韩在线综合| 亚洲欧洲在线观看| 99视频有精品| 欧美另类一区二区三区| 亚洲国产精品免费| 久久久水蜜桃| 久久综合电影| 国产一区二区0| 久久av一区二区三区亚洲| 亚洲一区一卡| 欧美视频导航| 久久最新视频| 久久夜色精品国产| 精品粉嫩aⅴ一区二区三区四区| 亚洲影院色无极综合| 亚洲欧美国产一区二区三区| 国产亚洲女人久久久久毛片| 久久久爽爽爽美女图片| 免费欧美视频| 亚洲国产精品成人va在线观看| 在线天堂一区av电影| 国产精品一区免费观看| 久久人91精品久久久久久不卡| 欧美成黄导航| 亚洲视频免费在线| 国产精品国产三级国产a| 亚洲综合视频在线| 欧美成人在线影院| 亚洲欧美国产不卡| 国产日韩欧美综合在线| 美女露胸一区二区三区| 在线一区欧美| 麻豆av一区二区三区久久| 亚洲精品免费观看| 国产区精品在线观看| 欧美gay视频| 亚洲尤物视频网| 欧美成人影音| 久久精品国产亚洲一区二区| 亚洲最黄网站| 在线欧美亚洲| 国产精品一区在线观看你懂的 | 欧美+日本+国产+在线a∨观看| 制服丝袜激情欧洲亚洲| 蜜桃伊人久久| 欧美一级视频一区二区| 日韩亚洲一区二区| 国产精品一区二区a| 欧美成人中文字幕在线| 小黄鸭精品aⅴ导航网站入口| 欧美xx69| 久久精品噜噜噜成人av农村| 亚洲欧美中文日韩在线| 亚洲精品在线三区| 国产精品揄拍500视频| 国产精品久久久久久久7电影 |