• <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>

            Stoer_Wagner 算法,求無向圖的最小割

              prim算法不僅僅可以求最小生成樹,也可以求“最大生成樹”。最小割集Stoer-Wagner算法就是典型的應(yīng)用實(shí)例。

                求解最小割集普遍采用Stoer-Wagner算法,不提供此算法證明和代碼,只提供算法思路:

            1.min=MAXINT,固定一個(gè)頂點(diǎn)P

            2.從點(diǎn)P用類似prim的s算法擴(kuò)展出“最大生成樹”,記錄最后擴(kuò)展的頂點(diǎn)和最后擴(kuò)展的邊

            3.計(jì)算最后擴(kuò)展到的頂點(diǎn)的切割值(即與此頂點(diǎn)相連的所有邊權(quán)和),若比min小更新min

            4.合并最后擴(kuò)展的那條邊的兩個(gè)端點(diǎn)為一個(gè)頂點(diǎn)(當(dāng)然他們的邊也要合并,這個(gè)好理解吧?)

            5.轉(zhuǎn)到2,合并N-1次后結(jié)束

            6.min即為所求,輸出min

            prim本身復(fù)雜度是O(n^2),合并n-1次,算法復(fù)雜度即為O(n^3)

            如果在prim中加堆優(yōu)化,復(fù)雜度會(huì)降為O((n^2)logn)


            #include <cmath>

            #include 
            <cstdio>

            #include 
            <memory.h>

            #include 
            <algorithm>

            #include 
            <iomanip>

            #include 
            <iostream>

            #include 
            <vector>

            #include 
            <string>

            #include 
            <queue>

             

            using namespace std;

             

            const int N = 500 + 3;

             

            int n, m;

            int mat[N][N];

            int dist[N];

            int visited[N];

            int del[N];  // true表示該點(diǎn)已經(jīng)被刪掉

             

            // 結(jié)點(diǎn)~n

            int Stoer_Wagner()

            {

                 
            int minCut = INT_MAX;  // 無向圖最小割

                 
            int tmp;

                 
            int i, t, j, k, pre;

                 
            int s = 1;   // 源點(diǎn)

                 memset(del, 
            0sizeof(del));

             

                 
            for (t = 1; t < n; t++)  // n - 1次Maximum Adjacency Search

                 {

                     
            for (i = 1; i <= n; i++)

                          
            if (!del[i])

                               dist[i] 
            = mat[s][i];

             

                     memset(visited, 
            0sizeof(visited));

                     visited[s] 
            = 1;

                     k 
            = s;

                     
            for (i = 1; i <= n - t; i++)  // 每次剩下n - t + 1個(gè)結(jié)點(diǎn)

                     {

                          tmp 
            = -1e9;

                          pre 
            = k;

                          k 
            = 0;

                          
            for (j = 1; j <= n; j++)

                          {

                               
            if (!del[j] && !visited[j] && dist[j] > tmp)

                               {

                                   k 
            = j;

                                   tmp 
            = dist[j];

                               }

                          }

                          
            if (!k) return 0;  // 不連通

             

                          visited[k] 
            = 1;

                          
            for (j = 1; j <= n; j++)

                               
            if (!del[j] && !visited[j])

                                   dist[j] 
            += mat[k][j];

                     }

             

                     minCut 
            = min(minCut, dist[k]);

                     del[k] 
            = 1;  // 刪除k點(diǎn)

             

                     
            // 合并k點(diǎn)和源點(diǎn)

                     

                     
            for (i = 1; i <= n; i++)

                          
            if (!del[i] && i != pre)

                          {

                               mat[pre][i] 
            += mat[k][i];

                               mat[i][pre] 
            = mat[pre][i];

                          }

                 }

             

                 
            return minCut;

            }

             

            int main ()

            {

                 
            int u, v, w, i;

                 
            while (scanf("%d%d"&n, &m) != EOF)

                 {

                     memset(mat, 
            0sizeof(mat));

                     
            while (m--)

                     {

                          scanf(
            "%d%d%d"&u, &v, &w);

                          
            if (u == v) continue;  

                          mat[u 
            + 1][v + 1+= w;

                          mat[v 
            + 1][u + 1+= w;

                     }

                     printf(
            "%d\n", Stoer_Wagner());

                 }

            }


            posted on 2010-10-25 23:46 yzhw 閱讀(534) 評(píng)論(0)  編輯 收藏 引用 所屬分類: graph theory


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            統(tǒng)計(jì)系統(tǒng)

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            久久久久亚洲AV成人网| 人妻丰满?V无码久久不卡| 亚洲国产欧美国产综合久久| 精品熟女少妇AV免费久久| 国产综合久久久久| 9999国产精品欧美久久久久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 精品一久久香蕉国产线看播放| 国产精品无码久久综合网| 波多野结衣久久一区二区 | 色综合久久中文综合网| 亚洲国产成人乱码精品女人久久久不卡 | 国产福利电影一区二区三区,免费久久久久久久精 | 久久精品国产精品亜洲毛片| 亚洲国产精品无码久久久蜜芽| 青青草国产精品久久| 亚洲va久久久噜噜噜久久狠狠 | 精品蜜臀久久久久99网站| 久久久久无码中| 香港aa三级久久三级| 久久精品无码专区免费青青| 欧美激情精品久久久久久久| 久久99久久99小草精品免视看| 久久人人爽人人爽人人片AV不| 国产精品久久久久久久午夜片| 国内精品人妻无码久久久影院| 久久99热这里只频精品6| 久久AAAA片一区二区| 久久免费精品视频| 韩国三级大全久久网站| 久久青青草原亚洲av无码app| 亚洲精品蜜桃久久久久久| 久久亚洲中文字幕精品一区四| 久久91精品综合国产首页| 青青热久久综合网伊人| 99久久成人国产精品免费| 久久久免费精品re6| 欧美va久久久噜噜噜久久| 色综合久久久久综合体桃花网| 中文字幕日本人妻久久久免费| 亚洲午夜无码久久久久|