POJ-1287-Networking [最小生成树]

来源:互联网 发布:查日本经济数据的网站 编辑:程序博客网 时间:2024/05/17 06:12

题目传送门


题意:
给出N个点以及M跳边权,求最小生成树
思路:
邻接矩阵建图,prim求最小生成树,注意判断重边

#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <queue>#include <set>#include <map>using namespace std;int mp[120][120], N, M;const int inf = 0x3f3f3f3f;void init(){    for (int i = 0; i < 120; i++)        for (int j = 0; j < 120; j++)            mp[i][j] = inf;    return;}void prim(int x){    int book[120], dis[120], ans;    memset(book,0,sizeof(book));    for (int i = 1; i <= N; i++)        dis[i] = mp[x][i];    book[x] = 1;    ans = 0;    for (int i = 1; i < N; i++)    {        int mi = inf, f = -1;        for (int j = 1; j <= N; j++)        {            if (!book[j] && dis[j]<mi)            {                mi = dis[j];                f = j;            }        }        if (f==-1)        {            printf("-1\n");            return;        }        ans += mi;        book[f] = 1;        for (int j = 1; j <= N; j++)        {            if (!book[j] && dis[j]>mp[f][j])            {                dis[j] = mp[f][j];            }        }    }    printf("%d\n", ans);    return ;}int main(void){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    while (scanf("%d", &N))    {        init();        if (N == 0)            break;        scanf("%d", &M);        while (M--)        {            int x, y, dis;            scanf("%d %d %d", &x, &y, &dis);            if (mp[x][y]>dis && mp[y][x]>dis)            {                mp[x][y] = dis;                mp[y][x] = dis;            }        }        prim(1);    }    return 0;}