poj 1251 Jungle Roads

来源:互联网 发布:淘宝开店要求 编辑:程序博客网 时间:2024/06/07 03:19

原题链接:http://poj.org/problem?id=1251
用Prim求最小生成树。具体实现如下:

#include<stdio.h>#include<string.h>#include<stdlib.h>#define Max_N 40#define INF 0x3f3f3f3f#define _min(a,b) ((a)>(b)?(b):(a))int V,vis[Max_N], mincost[Max_N], cost[Max_N][Max_N];void Prim(){    int u, res = 0;    for (u = 0; u<V; u++)        mincost[u] = (u == 0 ? 0 : INF);    memset(vis, 0, sizeof(vis));    for (;;)    {        int v = -1;        for (u = 0; u < V; u++){            if (!vis[u] && (-1 == v || mincost[u] < mincost[v])) v = u;        }        if (-1 == v) break;        vis[v] = 1;        res += mincost[v];        for (u = 0; u<V; u++)            mincost[u] = _min(mincost[u], cost[v][u]);    }    printf("%d\n", res);}int main(){#ifdef LOCAL    freopen("in.txt", "r", stdin);    freopen("out.txt", "w+", stdout);#endif    int i, t, k;    char s1[2],s2[2];    while (~scanf("%d", &V) && V){        for (i = 0; i < V; i++){            for (k = 0; k < V; k++)cost[i][k] = INF;        }        for (i = 1; i<V; i++){            scanf("%s%d", s1, &t);            while (t--){                scanf("%s%d", s2, &k);                int x = s1[0] - 'A', y = s2[0] - 'A';                cost[x][y] = cost[y][x] = k;            }        }        Prim();    }    return 0;}
0 0