题目:https://www.luogu.com.cn/problem/P3366
普利姆算法:
每次选(与已选的点相连的)最小边,循环n-1次
C语言:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MaxValue = 0x7fffffff;
int n, m;
int a[5005][5005], dis[5005], vis[5005];
int min(int a, int b)
{
if (a > b)
return b;
else
return a;
}
void Prim()
{
int i, tot = 1, min1, j, sum = 0;
while (tot < n)
{
min1 = MaxValue;
j = 0;
for (i = 1; i <= n; i++) //找到最小边
{
if (vis[i] == 0 && dis[i] < min1)
{
j = i;
min1 = dis[i];
}
}
if (j == 0) //不连通
{
printf("orz");
return ;
}
tot += 1;
vis[j] = 1;
sum += dis[j];
for (i = 1; i <= n; i++)
{
if (vis[i] == 0 && dis[i] > a[j][i])
dis[i] = a[j][i];
}
}
printf("%d", sum);
}
int main()
{
int i, x, y, z, j;
scanf("%d%d", &n, &m);
memset(vis, 0, sizeof(vis));
for (i = 1; i <= n; i++)
{
dis[i] = MaxValue;
for (j = 1; j <= n; j++)
a[i][j] = MaxValue;
}
for (i = 0; i < m; i++)
{
scanf("%d%d%d", &x, &y, &z);
a[x][y] = min(a[x][y], z);
a[y][x] = min(a[x][y], z);
if (x == 1) //先选定1点
dis[y] = min(dis[y], z);
else if (y == 1)
dis[x] = min(dis[x], z);
}
vis[1] = 1;
Prim();
return 0;
}
Python:
用字典类型 + 结构体数组 存储边:
定义:
class Edge():
def __init__(self, _y, _data):
self.y = _y
self.data = _data
造边:
for i in range(m):
s = input()
x, y, z = s.split(' ') #从x到y,长度z
x = int(x)
y = int(y)
z = int(z)
if x in edg.keys(): #x中是否已有数
a = edg[x] #有
else:
a = [] #无则创造列表
a.append(Edge(y, z))
edg[x] = a
代码:
class Edge():
def __init__(self, _y, _data):
self.y = _y
self.data = _data
s = input()
n, m = s.split(' ')
n = int(n)
m = int(m)
edg = {}
dis = [0x7fffffff for i in range(n + 5)]
vis = [0 for i in range(n + 5)]
for i in range(m):
s = input()
x, y, z = s.split(' ')
x = int(x)
y = int(y)
z = int(z)
if x in edg.keys():
a = edg[x]
else:
a = []
a.append(Edge(y, z))
edg[x] = a
if y in edg.keys():
a = edg[y]
else:
a = []
a.append(Edge(x, z))
edg[y] = a
if x == 1:
dis[y] = min(dis[y], z)
elif y == 1:
dis[x] = min(dis[x], z)
tot = 1
vis[1] = 1
ans = 0
while tot < n:
min1 = 0x7fffffff
j = 0
for i in range(1, n + 1):
if dis[i] < min1 and vis[i] == 0:
j = i
min1 = dis[i]
if j == 0:
print("orz")
exit(0)
vis[j] = 1
tot += 1
ans += dis[j]
for i in edg[j]:
if i.data < dis[i.y] and vis[i.y] == 0:
dis[i.y] = i.data
print(ans)