ZOJ 1372 Networking(Prim求最小生成树)

来源:互联网 发布:淘宝手工制作发夹材料 编辑:程序博客网 时间:2024/04/29 09:41

题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=372

思路:一般需要考虑的就是能否组成最小生成树和2点之间选取最短边

AC代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>const int inf = 0x3f3f3f3f;//1061109567typedef long long LL;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;int n,p;int map1[60][60];int visit[60];int lowdist[60];int prim(){    memset(visit,0,sizeof(visit));    int sum = 0;    for(int i=1; i<=n; i++)        lowdist[i] = map1[1][i];    visit[1] = 1;    int k;    for(int i=1; i<n; i++)    {        int min1 = inf;        for(int j=2; j<=n; j++)        {            if(!visit[j] && lowdist[j] < min1)            {                min1 = lowdist[j];                k = j;            }        }        visit[k] = 1;        sum += lowdist[k];        for(int j=2; j<=n ;j++)        {            if(!visit[j] && map1[k][j] < lowdist[j])                lowdist[j] = map1[k][j];        }    }    return sum;}int main(){    int st,ed,value;    while(scanf("%d%d",&n,&p) && n)    {        memset(map1,inf,sizeof(map1));        for(int i=0; i<p; i++)        {            scanf("%d%d%d",&st,&ed,&value);            if(value < map1[st][ed] || value < map1[st][ed])                map1[st][ed] = map1[ed][st] = value;        }        printf("%d\n",prim());    }    return 0;}


0 0