Kruskal——模板

来源:互联网 发布:5g网络建设方案 编辑:程序博客网 时间:2024/05/16 13:02
#include <iostream>#include <cstdio>#include <algorithm>#include <map>#include <set>#include <queue>#include <stack>#include <cstring>#include <string>#include <cmath>#define maxi 50000 + 10#define maxn 20000 + 10#define INF  0x3f3f3f3fusing namespace std;struct edge{    int u,v,cost;};bool comp(const edge &a,const edge &b){     return a.cost < b.cost;}edge  es[maxi];int V,E,N,M,T;int f[maxn];void input(){    for (int i = 0; i < E; i++)    {        scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);        es[i].cost *= -1;        es[i].v += N;    }}void init(){    for(int i = 0; i < V; i++)        f[i] = i;    return ;}int find(int x){    if (x==f[x]) return x;    else        return f[x] = find(f[x]);}void unit(int x,int y){    x = find(x);    y = find(y);    if(x == y) return;    else f[x] = y;    return ;}bool same(int x,int y){    x = find(x);    y = find(y);    if (x==y)  return true;    else return false;}void solve(){    int ans=0;    init();    input();    sort (es,es+E,comp);      for(int j = 0; j < E; j++)      {         if (!same(es[j].u,es[j].v))        {            ans += es[j].cost;            unit(es[j].u,es[j].v);        }      }     ans += V*(10000);    cout << ans << endl;}int main(){   cin >> T;   while(T--)   {       cin >> N >> M >> E;       V = N + M;       solve();   }   return 0;}
0 0
原创粉丝点击