有向圖的最小生成樹 --- 最小樹形圖模板

模板題 . UVA--- 11183傳送

還有這道 POJ 3164 點這傳送

舉個例子:某個圖的部分圖中, 1->2權值為3邻遏, 2->1權值為4, 3->1權值為9赎线, 4->2權值為7糊饱。 那么可以看到,結點1和結點2是形成了一個環(huán)的。我們僅從其大小不知道刪除哪條邊比較好狭归,這時看到3->1權值為9文判, 如果走這條邊,那么接下來只能刪除掉2->1這條邊疚宇,同理走4->2的話就要刪除掉1->2這條邊。 那么就不妨建立新圖赏殃, 將1和2縮成一點,3->1的權值就變成了9-4=5讼撒, 4->2的權值變成了7-3=4股耽。 這樣的話物蝙,就相當于變相刪除了不需要走的邊了。形成新圖后诬乞,又變成了最小樹形圖的求解钠导,就這樣循環(huán)下去,直到圖中的最小邊集沒有環(huán)為止.

裸模板,直接上:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#define ll long long int
#define db double
using namespace std;
const int maxn=1e3;  //點數[0-n-1]
const int maxm=1e7;  //邊數
const int inf=1e9;
int n,m;
struct edge
{
    int u,v,w;
} s[maxn*maxn/2];

int pre[maxn]; //記錄前驅.
int id[maxn];
int vis[maxn];
int in[maxn];

void p(int *a,int n)
{
    for(int i=1;i<=n;i++)
        printf("%d%c",a[i],i==n?'\n':' ');
}
int dirMst(int root)   //這種圖中根一定是確定的.
{
    int ans=0;
    while(1)
    {
        for(int i=0; i<n; i++)
            in[i]=inf;
        memset(id,-1,sizeof(id));
        memset(vis,-1,sizeof(vis));
        for(int i=0;i<m;i++)
        {
            int u=s[i].u;
            int v=s[i].v;
            int w=s[i].w;
            if(w<in[v] && v != u )
            {
                pre[v] = u;
                in[v] = w;
            }
        }           //求最小入邊集
        in[root]=0;
        pre[root]=root;//為之后的遍歷做準備票堵,in[]用于存儲最小邊集
        for(int i=0; i<n; i++)
        {
            if(in[i] == inf)
                return -1;
            ans += in[i];
        }          //此循環(huán)判斷是否有孤立節(jié)點悴势,同時計算當前最小權值和
        int idx = 0;//idx是用來給新的節(jié)點賦名稱的(新序號)
        for(int i=0;i<n;i++)
        {
            if(vis[i] == -1 )
            {
                int u = i;
                while(vis[u] == -1){
                    vis[u] = i;
                    u = pre[u];
                }       //將vis[u]賦值為i是為了做標記
                if(vis[u] != i || u == root ) continue;     //判斷是否形成環(huán),未形成環(huán)就直接跳出.
                //只有是環(huán)的才能進入for循環(huán).
                for(int v=pre[u];v!=u;v=pre[v] )
                    id[v] = idx;             //給環(huán)上的點賦值一個統一的標號措伐,形成一個新的點(id[i]用于存儲i點的新標號)
                id[u] = idx++;               //不在環(huán)上的新標號跟著另.
            }
        }
        if(idx==0) break;//沒有環(huán),跳出循環(huán)
        for(int i=0;i<n;i++){
            if(id[i]== -1){
                id[i]=idx++;//在上一個循環(huán)給環(huán)賦予新的序號捧存,這一步是給非環(huán)的點新的序號,保證新圖中每個點有相應的標號
            }
        }
        for(int i=0;i<m;i++)   //造新圖.
        {
            s[i].w -= in[s[i].v];//把每個點的其他入邊看做環(huán)的入邊镰官,將增值賦給環(huán)的入邊傻咖,作為新圖的這個新的點的該條入邊的權值
            s[i].u = id[s[i].u];
            s[i].v = id[s[i].v];
        }            //這個循環(huán)是修改舊圖,把id中存儲的映射到圖中形成新圖
        n = idx;     //這個很重要卿操,要知道把環(huán)捏成一個點,那么圖中點個數改變了扇雕,所以循環(huán)次數改變
        root = id[root];//給根新的標號
    }
    return ans;
}

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d",&s[i].u,&s[i].v,&s[i].w);
        }
        int res=dirMst(0);    //以0為根開始搜.
        printf("%d\n",res);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末镶奉,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子哨苛,更是在濱河造成了極大的恐慌币砂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亿蒸,死亡現場離奇詭異掌桩,居然都是意外死亡,警方通過查閱死者的電腦和手機波岛,發(fā)現死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門则拷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隔躲,你說我怎么就攤上這事〗龈福” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵耗溜,是天一觀的道長省容。 經常有香客問我,道長腥椒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任洒放,我火速辦了婚禮滨砍,結果婚禮上,老公的妹妹穿的比我還像新娘惋戏。我一直安慰自己,他們只是感情好蔓腐,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布龄句。 她就那樣靜靜地躺著分歇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪职抡。 梳的紋絲不亂的頭發(fā)上误甚,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音擅威,去河邊找鬼。 笑死郊丛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的厉熟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼白翻,長吁一口氣:“原來是場噩夢啊……” “哼绢片!你這毒婦竟也來了?” 一聲冷哼從身側響起杉畜,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤此叠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灭袁,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡倦炒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年逢唤,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳖藕。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡只锭,死狀恐怖,靈堂內的尸體忽然破棺而出蜻展,到底是詐尸還是另有隱情,我是刑警寧澤纵顾,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布施逾,位于F島的核電站贞盯,受9級特大地震影響,放射性物質發(fā)生泄漏躏敢。R本人自食惡果不足惜整葡,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啼器。 院中可真熱鬧,春花似錦端壳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至话侧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞻鹏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工薪夕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叭披,地道東北人玩讳。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像同诫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子误窖,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • 數據結構與算法--從平衡二叉樹(AVL)到紅黑樹 上節(jié)學習了二叉查找樹。算法的性能取決于樹的形狀霹俺,而樹的形狀取決于...
    sunhaiyu閱讀 7,649評論 4 32
  • 第一章 緒論 什么是數據結構? 數據結構的定義:數據結構是相互之間存在一種或多種特定關系的數據元素的集合愈魏。 第二章...
    SeanCheney閱讀 5,775評論 0 19
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結點至多有m個孩子想际。 除根結點和葉子結點外,其它每個結點至少有m...
    文檔隨手記閱讀 13,222評論 0 25
  • 一. 算法之變牌柄,結構為宗 計算機在很多情況下被應用于檢索數據,比如航空和鐵路運輸業(yè)的航班信息和列車時刻表的查詢珊佣,都...
    Leesper閱讀 6,910評論 13 42
  • 1.樹(Tree): 樹是 n(n>=0) 個結點的有限集闺骚。當 n=0 時稱為空樹。在任意一顆非空樹中:有且僅有一...
    ql2012jz閱讀 1,006評論 0 3