局域网
题目
就是一个图,求最小生成树,然后求被去除的边的价值。
输入
用线来表示联通
5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
输出
去除的边的总价值
8
解题思路
求出最小生成树的价值然后线的总值减去最小生成树的价值
代码
#include<cstdio>
using namespace std;
int n,k,cost[101][101],lowcost[101],x,y,w,s,last,maxs;
bool ok[101];
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) cost[i][j]=23333333;
//初始化
for (int i=1;i<=k;i++)
{
scanf("%d%d%d",&x,&y,&w);
cost[x][y]=w;
cost[y][x]=w;//联通
maxs+=w;//求总值
}
for (int i=1;i<=n;i++) lowcost[i]=cost[1][i];
//每个点到集合的最小值
ok[1]=true;//封路
for (int i=2;i<=n;i++)
{
int k=0,mins=23333333;
for (int j=1;j<=n;j++)
if (!ok[j] && lowcost[j]<mins)
{
mins=lowcost[j];
k=j;
}//找最近的店
ok[k]=true;//标记
s+=lowcost[k];//求和
for (int j=1;j<=n;j++)
if (lowcost[j]>cost[k][j]) lowcost[j]=cost[k][j]; //修正每个点到集合的最小值
}
printf("%d",maxs-s);//输出
}