Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
Bessie受雇来到John的农场帮他们建立internet网络。农场有 N (2<= N <= 1,000)牛棚,编号为1..N。John之前已经勘测过,
发现有M(1<=M<=20,000)条可能的连接线路,一条线路是连接某两个牛棚的。每条可能的线路都有一个建设费用C
(1<=C<=100,000)。John当然想花尽量少的钱,甚至克扣Bessie的工钱。
Bessie发现了这点,很生气,决定给John捣乱。她要选择一些线路组成网,但费用却尽可能大。当然网络要能正常工作,也就是
任意两个牛棚之间都是相互可以连通的,并且网络上不能有环,不然John会很容易发现的。
请计算组建这种网络最多可能的费用。
【输入格式】
第一行:两个整数 N M
下面M行:每行3个整数A,B,C。表示一个可能的线路要连接A、B两个牛棚,费用是C。
【输出格式】
只一行,一个整数,即花费最大的费用。如果不可能连接通所有牛棚,输出-1。
17 + 8 + 10 + 7 = 42
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
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t047
【题解】
题目其实是要让你求一棵最大生成树;
只要在做最小生成树的时候,把判断的”>”和”<”号换一下就可以了;
给的代码是普利姆算法的;
(中间如果有某个点不能连接,那么它的dis值会为初值)
(如果是克鲁斯卡尔算法的话,那么最后判断依据就是整张图是否联通)
(note:已经进入最小生成树的点不能再更新了!)
【完整代码】
#include <cstdio>
#include <vector>
using namespace std;
#define rei(x) scanf("%d",&x)
#define pb push_back
#define rep1(i,x,y) for (int i = x;i <= y;i++)
const int MAXN = 1e3+10;
int n,m,dis[MAXN],ans = 0;
vector <int> g[MAXN],w[MAXN];
bool bo[MAXN];
int main()
{
//freopen("F:\rush.txt","r",stdin);
rei(n);rei(m);
rep1(i,1,m)
{
int x,y,z;
rei(x);rei(y);rei(z);
g[x].pb(y);w[x].pb(z);
g[y].pb(x);w[y].pb(z);
}
rep1(i,1,n)
dis[i] = -2;
dis[1] = 0;
while (true)
{
int ma = -1,k = -1;
rep1(j,1,n)
if (dis[j]>ma && !bo[j])
{
ma = dis[j];
k = j;
}
if (k==-1)
break;
bo[k] = true;
int len = g[k].size();
rep1(j,0,len-1)
{
int y = g[k][j],cost = w[k][j];
if (!bo[y] && dis[y]<cost)
dis[y] = cost;
}
}
rep1(i,1,n)
{
ans+=dis[i];
if (dis[i]==-2)
{
ans = -1;
break;
}
}
printf("%d
",ans);
return 0;
}