constint MAXN = 5001; int n, m; // n个节点,m条边 int graph[MAXN][MAXN]; int lowcost[MAXN]; //表示以i为终点的边到最小生成树的最小权值 int mst[MAXN]; //表示对应lowcost[i]的起点
intprim() {
int sum = 0; //初始化lowcost和mst,选定第一个节点为起点 for (int i = 2; i <= n; i++) { lowcost[i] = graph[1][i]; mst[i] = 1; } mst[1] = 0; for (int i = 0; i < n - 1; i++) { int minn = INT_MAX, minId = 0; //寻找 到最小生成树距离最小的点 for (int j = 2; j <= n; j++) { if (lowcost[j] < minn && lowcost[j] != 0) { minn = lowcost[j]; minId = j; } } if (minn == INT_MAX) return0; //如果minn值没变,说明该图不连通 sum += minn; //累加权值 lowcost[minId] = 0; //将minId表示的点纳入最小生成树 //更新lowcost和mst数组 for (int j = 2; j <= n; j++) { //由于最小生成树只比上一个状态多一个点,变化只是由这一个点引起的,遍历该点到其他点的边即可 if (graph[minId][j] < lowcost[j]) { lowcost[j] = graph[minId][j]; mst[j] = minId; } } } return sum; }
intmain() { cin >> n >> m; //初始化graph为极大值 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) graph[i][j] = INT_MAX; for (int i = 0; i < m; i++) { int from, to, cost; cin >> from >> to >> cost; graph[from][to] = cost; graph[to][from] = cost; } int res = prim(); if (res == 0) cout << "orz" << endl; else cout << res << endl; return0; }
constint MAXN = 5001; //最大点数 constint MAXM = 2e5; //最大边数 int n, m; // n个节点,m条边 int cnt; int dis[MAXN]; //已经加入最小生成树的的点到没有加入的点的最短距离 int head[MAXN]; //节点i的所有连边 int vis[MAXN]; //标记点是否已经纳入最小生成树,1表示已纳入,0表示未纳入
structNode { int v, w, next; } edge[MAXM << 1];
//链式前向星加边 voidadd(int u, int v, int w) { edge[++cnt].v = v; edge[cnt].w = w; edge[cnt].next = head[u]; head[u] = cnt; }
intprim() { int sum = 0, tot = 0, minId = 1; memset(vis, 0, sizeof(vis)); //初始化为0 //初始化dis,选定第一个节点为起点,初始化dis vis[1] = 1; //设置1号节点已纳入最小生成树 for (int i = head[1]; i; i = edge[i].next) dis[edge[i].v] = min(dis[edge[i].v], edge[i].w); //用min防止重边
while (++tot < n) { int minn = INT_MAX, minId = 0; //寻找 到最小生成树距离最小的点 for (int i = 2; i <= n; i++) { if (!vis[i] && dis[i] < minn) { minn = dis[i]; minId = i; } } if (minn == INT_MAX) return0; //如果minn值没变,说明该图不连通 sum += minn; //累加权值 vis[minId] = 1; //将minId表示的点纳入最小生成树 //枚举minId的所有连边,更新dis数组 for (int i = head[minId]; i; i = edge[i].next) { int v = edge[i].v; if (dis[v] > edge[i].w && !vis[v]) dis[v] = edge[i].w; } } return sum; }
intmain() { cin >> n >> m; for (int i = 0; i < m; i++) { int from, to, cost; cin >> from >> to >> cost; add(from, to, cost); add(to, from, cost); } //初始化dis为极大值 for (int i = 0; i <= n; i++) dis[i] = INT_MAX; int res = prim(); if (res == 0) cout << "orz" << endl; else cout << res << endl; return0; }