poj 1287 Networking(图论:最小生成树)

来源:互联网 发布:python软件哪里下载 编辑:程序博客网 时间:2024/06/07 01:01

因为题目中说了任两个节点之间可能会有多条边的存在

所以读入边的过程中要存取最小边

这样的话用prim写会方便些,因为Kruskal读边的过程是依次读入,很难更新

而prim是存在矩阵中,更新很简单,只需要把该矩阵所有元素都初始化为最大值即可

代码如下:

#include <cstdio>#include <iostream>#include <algorithm>#define MAXN 10010#define LL long long#define INF 0x7fffffffusing namespace std;int n, m, g[MAXN][MAXN], dis[MAXN];int prim() {    int now, minedge, minnode;    int i, j, ans;    for(i=1; i<=n; ++i)        dis[i] = INF;    now = 1;    ans = 0;    for(i=0; i<n-1; ++i) {        dis[now] = -1;        minedge = INF;        for(j=1; j<=n; ++j) {            if(now!=j && dis[j]>=0) {                dis[j] = min(dis[j], g[now][j]);                if(dis[j] < minedge) {                    minedge = dis[j];                    minnode = j;                }            }        }        now = minnode;        ans += minedge;    }    return ans;}int main(void) {    int i, j, x, y, len;    while(cin >> n && n) {        cin >> m;        for(i=1; i<=n; ++i)            for(j=i; j<=n; ++j)                g[i][j] = g[j][i] = MAXN;        while(m--) {            cin >> x >> y >> len;            g[x][y] = g[y][x] = min(g[x][y], len);        }        cout << prim() << endl;    }}


0 0
原创粉丝点击