简单题,模板题
求解最大生成树,提交一直WA,感觉没有什么问题啊,就是在求解最小生成树的模板基础上稍加修改即可,后来发现在输出a,b,c给map二维数组的时候还必须有判断条件,略为有点坑,因为之前做的没有加判断条件也AC了,加上比较严谨一些吧。
http://poj.org/problem?id=2377
cin >> a >> b >> c;
if(c > map[a][b])
{
map[a][b] = c;
map[b][a] = c;
}
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
typedef long long ll;
using namespace std;
ll d[1100];
bool vis[1100];
ll map[1100][1100];
int main()
{
ll n,m,a,b,c,res;
cin >> n >> m;
ll i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
map[i][j] = 0;
else
map[i][j] = -INT_MAX;
for(i=1;i<=m;i++)
{
cin >> a >> b >> c;
if(c > map[a][b])
{
map[a][b] = c;
map[b][a] = c;
}
}
for(i=1;i<=n;i++)
d[i] = map[1][i];
vis[1] = true;
res = 0;
ll pos;
ll flag = 1;
for(i=1;i<n;i++)
{
ll maxn = -INT_MAX;
for(j=1;j<=n;j++)
{
if(!vis[j] && d[j]>maxn)
{
maxn = d[j];
pos = j;
}
}
if(maxn == -INT_MAX)
{
flag = 0;
cout << "-1" << endl;
break;
}
else
{
vis[pos] = true;
res += maxn;
for(j=1;j<=n;j++)
{
if(!vis[j] && d[j]<map[pos][j])
{
d[j] = map[pos][j];
}
}
}
}
if(flag)
cout << res << endl;
return 0;
}