Uva 908 Re-connecting Computer Site

Uva 908 Re-connecting Computer Site
Question:

標準 MST 問題:使用 Kruskal's Algorithm

Code:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std;
typedef pair<int,int> ii;
#define MAXN 1000005
int g[MAXN];
void ini(int n)
{
    for(int i=1; i<=n; i++)
    {
        g[i]=i;
    }
}
int Find(int a)
{
    if(a!=g[a]) g[a]=Find(g[a]);
    return g[a];
}
void Union(int a,int b)
{
    if(Find(a)!=Find(b))
    {
        g[g[a]]=g[b];
    }
}
int Kruskal(priority_queue<pair<int,ii> > &ppq)
{
    int cost=0;
    while(!ppq.empty())
    {
        pair<int,ii> tmp=ppq.top();
        ppq.pop();
        if(Find(g[tmp.second.first])!=Find(g[tmp.second.second]))
        {
            cost+=(0-tmp.first);
            Union(tmp.second.first,tmp.second.second);
        }
    }
    return cost;
}
int main()
{
    int n=0,flag=0;
    while(cin>>n)
    {
        int k,m;
        int a,b,c,ans1=0,ans2=0;
        memset(g,-1,sizeof(g));
        ini(n);
        for(int i=0; i<n-1; i++)
        {
            cin>>a>>b>>c;
            ans1+=c;
        }
        priority_queue<pair<int,ii> > pq;
        cin>>k;
        for(int i=0; i<k; i++)
        {
            cin>>a>>b>>c;
            pq.push(make_pair(0-c,make_pair(a,b)));
        }
        cin>>m;
        for(int i=0; i<m; i++)
        {
            cin>>a>>b>>c;
            pq.push(make_pair(0-c,make_pair(a,b)));
        }
        if(flag==1) cout<<endl;
        flag=1;
        ans2=Kruskal(pq);
        cout<<ans1<<endl<<ans2<<endl;
    }
    return 0;

}

重點程式碼(Kruskal):

typedef pair<int,intii;
#define MAXN 1000005
int g[MAXN];
void ini(int n
{
    for(int i=1i<=ni++)
    {
        g[i]=i;
    }
}
int Find(int a)
{
    if(a!=g[a]) g[a]=Find(g[a]);
    return g[a];
}
void Union(int a,int b)
{
    if(Find(a)!=Find(b))
    {
        g[g[a]]=g[b];
    }
}
int Kruskal(priority_queue<pair<int,ii> > &ppq)
{
   //主程式用pq存邊的權重<(negative) weight(i,j),<i,j> > 
   //存負權重用Priority_Queue才會由小排到大(記得加回來時多個負號)
    int cost=0;
    while(!ppq.empty())
    {
        pair<int,iitmp=ppq.top();
        ppq.pop();
        if(Find(g[tmp.second.first])!=Find(g[tmp.second.second]))
        {
            cost+=(0-tmp.first);
            Union(tmp.second.first,tmp.second.second);
        }
    }
    return cost;
}

留言

這個網誌中的熱門文章

Things a Little Bird Told Me: Confessions of the Creative Mind

UVa 12970 Alcoholic Pilots

UVa 483 Word Scramble