最小生成树基础-----HDOJ1863

Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
 

Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
 

Sample Input
  
  
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
 

Sample Output
  
  
3 ? 克鲁斯卡尔算法
#include<stdio.h>
#include <algorithm>
using namespace std;
struct Edge{//定义结构体:起点,终点,和边权
	int from, to, val;
};
Edge edge[101*101];
bool cmp(Edge a, Edge b){//sort排序
	return a.val < b.val;
}
int pre[101];
int Find(int p)//对根的查找与并查集完全一致
{
	while(p != pre[p])
		p = pre[p];
	return p;
}
void Merge(int x, int y)
{
	int fx = Find(x);
	int fy = Find(y);
	if(fx != fy)
		pre[fx] = fy;
}
int main()
{
	int n, m;
	while(scanf("%d", &m), m)
	{
		scanf("%d", &n);
		for(int i = 1; i <= n; i++)//初始化
			pre[i] = i;
		for(int i = 0; i < m; i++)
			scanf("%d%d%d", &edge[i].from, &edge[i].to, &edge[i].val);
		sort(edge, edge+m, cmp);//依照边权从小到大排序
		int sum = 0;
		for(int i = 0; i < m; i++)
		{
			int fx = Find(edge[i].from);
			int fy = Find(edge[i].to);
			if(fx != fy)//判断两根是否相同,若为同一棵树则构成环,不能选取
			{
				sum += edge[i].val;
				Merge(edge[i].from, edge[i].to);
			}
		}
		int cnt = 0;
		for(int i = 1; i <= n; i++)
		{
			if(pre[i] == i)
				cnt++;
		}
		if(cnt == 1)//若共为一个根,即一棵树则输出所需最低成本即可
			printf("%d\n", sum);
		else
			printf("?\n");
	}
	return 0;
}


Stkcd [股票代码] ShortName [股票简称] Accper [统计截止日期] Typrep [报表类型编码] Indcd [行业代码] Indnme [行业名称] Source [公告来源] F060101B [净利润现金净含量] F060101C [净利润现金净含量TTM] F060201B [营业收入现金含量] F060201C [营业收入现金含量TTM] F060301B [营业收入现金净含量] F060301C [营业收入现金净含量TTM] F060401B [营业利润现金净含量] F060401C [营业利润现金净含量TTM] F060901B [筹资活动债权人现金净流量] F060901C [筹资活动债权人现金净流量TTM] F061001B [筹资活动股东现金净流量] F061001C [筹资活动股东现金净流量TTM] F061201B [折旧摊销] F061201C [折旧摊销TTM] F061301B [公司现金流1] F061302B [公司现金流2] F061301C [公司现金流TTM1] F061302C [公司现金流TTM2] F061401B [股权现金流1] F061402B [股权现金流2] F061401C [股权现金流TTM1] F061402C [股权现金流TTM2] F061501B [公司自由现金流(原有)] F061601B [股权自由现金流(原有)] F061701B [全部现金回收率] F061801B [营运指数] F061901B [资本支出与折旧摊销比] F062001B [现金适合比率] F062101B [现金再投资比率] F062201B [现金满足投资比率] F062301B [股权自由现金流] F062401B [企业自由现金流] Indcd1 [行业代码1] Indnme1 [行业名称1] 季度数据,所有沪深北上市公司的 分别包含excel、dta数据文件格式及其说明,便于不同软件工具对数据的分析应用 数据来源:基于上市公司年报及公告数据整理,或相关证券交易所、各部委、省、市数据 数据范围:基于沪深北证上市公司 A股(主板、中小企业板、创业板、科创板等)数据整理计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值