洛谷 P3366 【模板】最小生成树


程序说明

prim算法,注意有重边(此题大坑 !),因此每次输入权值后要进行比较。另外自回环也应该排除在外。用一个cnt变量累加计算权值之和,G[adj[k]][k]表示生成树的路径的权值。(k表示纳入生成树的顶点的下标,adj[k]表示与k相邻的顶点的下标)
数据里貌似没有出现非连通图??没有输出orz也能过。。

代码如下:

#include 
#define MAX 5000
#define INF 65535
using namespace std;
int G[MAX][MAX];
int n, m, x, y, z, k, cnt;
int adj[MAX];
int lowcost[MAX];
int main() {    
    cin>>n>>m;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++) {
            G[i][j] = INF;
            if(i == j)
                G[i][j] = 0;
        }
    for(int i = 0; i < m; i++) {
        cin>>x>>y>>z;
        if(z < G[x-1][y-1] && x != y) {
            G[x-1][y-1] = z;
            G[y-1][x-1] = G[x-1][y-1];
        }
        else
            continue;
    }
    //prim算法
    int i, j, k;
    for(int i = 0; i < n; i++) {
        lowcost[i] = G[0][i];
        adj[i] = 0;
    }
    lowcost[0] = 0;
    for(i = 1; i < n; i++) {
        int min = INF;
        k = 0;
        for(j = 1; j < n; j++) {
            if(min > lowcost[j] && lowcost[j] != 0) {
                min = lowcost[j];
                k = j;
            }
        }
        cnt += G[adj[k]][k];
        lowcost[k] = 0;
        for(j = 1; j < n; j++) {
            if(lowcost[j] > G[k][j] && lowcost[j] != 0) {
                lowcost[j] = G[k][j];
                adj[j] = k;
            }
        }
    }
    cout<

你可能感兴趣的:(洛谷 P3366 【模板】最小生成树)