• poj3723 MST好题 kruskal


    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define inf 10000000
    #define MAXN 20000
    
    struct Edge{
    	int x,y,len;
    }e[3*MAXN];
    int n,m,r,ans;
    int fa[MAXN];
    int find(int x)
    {
    	if(x != fa[x])
    		fa[x] = find(fa[x]);
    	return fa[x];
    }
    bool cmp(Edge x,Edge y)
    {
    	return x.len>y.len;
    }
    void kruskal()
    {
    	for(int i=0;i<=n+m;i++)
    		fa[i]=i;
    	ans=0;
    	sort(e,e+r,cmp);
    	int f1,f2;
    	for(int i=0;i<r;i++)
    	{
    		f1=find(e[i].x);
    		f2=find(e[i].y+n);
    		//cout<<e[i].x<<' '<<f1<<endl;
    		if(f1!=f2)
    		{
    			fa[f1]=f2;
    			ans+=e[i].len;
    
    		}
    	}
    }
    int main()
    {
    	int T;
    	scanf("%d",&T);
    	while(T--)
    	{
    
    		scanf("%d%d%d",&n,&m,&r);
    		for(int i=0;i<r;i++)
    		{
    			scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].len);
    		}
    		kruskal();
    		printf("%d
    ",10000*(n+m)-ans);
    	}
    }

    冒个泡表示还活着。。。

    这题需要转换下思维,就成最大生成树问题了。


  • 相关阅读:
    JUC并发工具包之Semaphore
    Linux命令
    uWSGI
    数据库 MySQL 练习
    c++
    c++ 初阶
    Git
    MySQl 和 Redis
    MySQL 查询
    MySQL 命令
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134097.html
Copyright © 2020-2023  润新知