贝茜受雇在农场主约翰的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; 这条语句。想法很新颖。其他的就是与之前的都一样,模板。