链接
题目描述
给出n个点,每个点可以选择在点上操作,然后把点加入集合,费用为i,亦可以选择让当前点连接包含操作过的点的集合,费用为j,现在要求把n个点全部都放在一个操作过的集合里,使得费用最小
样例输入
4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
样例输出
9
思路
很像以前在纪中做的给水——》戳这
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n, k, minx, ans;
int dis[100005], w[1005][1005], vis[100005];
int main()
{
memset(dis, 0x7f, sizeof(dis));
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &dis[i]);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
scanf("%d", &w[i][j]);
for(int i = 1; i <= n; ++i)
w[i][i] = 1e9;
minx = 1e9;
vis[0] = 1; dis[0] = 0;
for(int i = 1; i <= n; ++i)
{
int k = 0;
minx = 1e9;
for(int j = 1; j <= n; ++j)
{
if(!vis[j] && dis[j] < minx)
{
minx = dis[j];
k = j;
}
}
ans += dis[k];
vis[k] = 1;
dis[k] = w[i][k];
for(int j = 1; j <= n; ++j)
if(!vis[j] && dis[j] > w[k][j])
dis[j] = w[k][j];
}
printf("%d", ans);
return 0;
}