2014 UESTC Training for Graph Theory K

来源:互联网 发布:嵌入式系统编程 扫描版 编辑:程序博客网 时间:2024/05/21 19:33
如果原图直接联通那么就是一个简单的最小生成树问题,
那么就可以构造特殊点生成最小生成树跑一边kruskal得到答案就可以
注意并查集的应用,特殊点为0.首先合并所有特殊点

然后跑kruskal就可以了

#include <map>#include <set>#include <list>#include <cmath>#include<cctype>#include <ctime>#include <deque>#include <stack>#include <queue>#include <cstdio>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define PI 3.1415926535897932626using namespace std;int gcd(int a, int b){return a % b == 0 ? b : gcd(b, a % b);}#define MAXN 1005int p[MAXN];int N,M,K;int find(int x){return x==p[x]?x:p[x]=find(p[x]);}struct node{    int s,e;    int value;    friend bool operator < (const node &a,const node &b)    {        return a.value<b.value;    }}src[500000];void init(){    for (int i=0;i<=N;i++)        p[i]=i;    for (int i=0;i<K;i++)    {        int a;        scanf("%d",&a);        int r1=find(0);int r2=find(a);        if (r1!=r2) p[r1]=r2;    }    for (int i=0;i<M;i++)    scanf("%d%d%d",&src[i].s,&src[i].e,&src[i].value);    sort(src,src+M);}LL kruskal(){    LL ans=0;    for (int i=0;i<M;i++)    {        int r1=find(src[i].s),r2=find(src[i].e);        if (r1!=r2)        {            p[r1]=r2;            ans+=src[i].value;        }    }    return ans;}int main(){    //freopen("sample.txt","r",stdin);    while (scanf("%d%d%d",&N,&M,&K)!=EOF)    {        init();        printf("%lld\n",kruskal());    }    return 0;}


0 0
原创粉丝点击