/* *\
局域网
提交一次
最小生成树裸题。
松弛的时候两个点必须有边
(最好赋初值正无穷)
\* */
#include <iostream>
using std::cout;
using std::cin;
long n;long k;
const long oo = 0x7fff0000;
long map[102][102];
bool used[102];
long tot = 0;
long dist[102];
long sum = 0;
void input()
{
cin >> n >> k;
for (long i=1;i<k+1;i++)
{
long i;long j;long m;
cin >> i >> j >> m;
map[i][j] = map[j][i] = m;
sum += m;
}
}
void prim()
{
used[1] = true;
for (long i=1;i<n+1;i++)
{
if (map[1][i]>0)
dist[i] = map[1][i];
else
dist[i] = oo;
}
for (long i=1;i<n;i++)
{
long min = oo;
long k = 0;
for(long j=1;j<n+1;j++)
{
if (!used[j]&&dist[j]<min)
{
min = dist[j];
k = j;
}
}
tot += dist[k];
used[k] = true;
for (long j=1;j<n+1;j++)
{
if (!used[j]&&dist[j]>map[k][j]&&map[k][j]>0)
{
dist[j] = map[k][j];
}
}
}
}
int main()
{
input();
prim();
cout << sum-tot;
}
【局域网】解题报告
最新推荐文章于 2024-07-10 17:16:18 发布