Bad Cowtractors POJ - 2377(最大生成树3)

贝茜受雇在农场主约翰的N个谷仓(2 <= N <= 1000)之间建立一个廉价的互联网网络。FJ已经做了一些调查,发现了M (1 <= M <= 20,000)对谷仓之间可能的连接路径。每个可能的连接路由都有一个相关的成本C (1 <= C <= 100,000)。农民约翰想要在连接网络上花费最少的钱;他甚至都不想付钱给贝茜。意识到农场主约翰不会给她钱,贝茜决定做最坏的工作。她必须决定一组连接安装,所以(我)这些连接的总成本是尽可能大,(2)所有的谷仓都连接在一起(这样就可以达到任何谷仓从其他仓库通过安装连接的路径),和(iii),这样没有周期之间的连接(农民约翰很容易能够检测)。条件(ii)和(iii)确保最后的连接集看起来像一个“树”。

Input

*第1行:两个空格分隔的整数:N和M*线2 . .M+1:每行包含三个以空格分隔的整数A、B和C,它们描述了成本为C的仓库A和仓库B之间的连接路由。

Output

*第1行:单个整数,包含连接所有仓库的最昂贵树的价格。如果不可能连接所有的谷仓,输出-1。

Sample Input

5 8
1 2 3
1 3 7
2 3 10
2 4 4
2 5 8
3 4 6
3 5 2
4 5 17

Sample Output

42

Hint

OUTPUT DETAILS:

The most expensive tree has cost 17 + 8 + 10 + 7 = 42. It uses the following connections: 4 to 5, 2 to 5, 2 to 3, and 1 to 3.

与前面几个题目不一样的是这道题目是让求最大值不是最小值,与最小值的相似,解法相似。

看看这道题目是让干啥的,题目没有给出邻接矩阵,需要我们自己设置一个临界矩阵(与前面的做法一样),但是这道题又有了个情况就是如果不能将所有的点连起来的话,就输出-1,我们需要一个特定的标记,来实现点之间不相连(连不通的情况)。下面看看代码:
 

#include<iostream>
using namespace std;
const int maxn=1005;
#include<stdio.h>
#include<string.h>
#include<string>
typedef long long ll;

const int inf=(1<<21);
int map[maxn][maxn];
bool vis[maxn];
int d[maxn];

int main()
{
	int flag=1;
	int num,shuliang;
	int i,j;
	cin>>num>>shuliang;
	int x,y,c;
	
	
	for(i=1;i<=num;i++)
		for(j=1;j<=num;j++)
			if(i==j)
				map[i][j]=0;
			else	
				map[i][j]=-inf;
		
	
	for(i=1;i<=shuliang;i++)
	{
		cin>>x>>y>>c;
		if(c>map[x][y])
		{
			map[x][y]=c;
			map[y][x]=c;	
		}
	}
	
	for(i=1;i<=num;i++)
		d[i]=map[1][i];
	
	int res=0;
	int max=-inf;
	int pos;
	vis[1]=true;
	for(i=1;i<num;i++)
	{
		max=-inf;
		for(j=1;j<=num;j++)
			if(!vis[j]&&d[j]>max)
			{
				pos=j;
				max=d[j];
			}
		if(max==-inf)
		{
			flag=0;
			cout<<"-1"<<endl;
			break;
		}
		vis[pos]=true;
		res+=max;
		
		for(j=1;j<=num;j++)
		{
			if(!vis[j]&&d[j]<map[pos][j])
				d[j]=map[pos][j];
		}
		
	}
	if(flag)
		cout<<res<<endl;
	return 0;
}

就是我们需要提前对临界矩阵进行先标记,然后再往矩阵里面填充数据,就像这个我一开始就直接将矩阵全都标记为 -inf(一个很大的数据),然后再往里面填充数据,因为考虑到可能有重复的数据,我们就直接拿出那个最大的权值标记进去。如果这个点没有与其他的点相连的话,那么这个点的邻接矩阵还是那个 -inf。为什么要这样设置呢?在下面的判断中  

max=-inf;
		for(j=1;j<=num;j++)
			if(!vis[j]&&d[j]>max)
			{
				pos=j;
				max=d[j];
			}
		if(max==-inf)
		{
			flag=0;
			cout<<"-1"<<endl;
			break;
		}

就是这个如果(邻接矩阵它这个点全是-inf ),那么就执行 max==-inf  break;  这条语句。想法很新颖。其他的就是与之前的都一样,模板。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值