Chinaunix首页 | 论坛 | 博客
  • 博客访问: 474227
  • 博文数量: 117
  • 博客积分: 3195
  • 博客等级: 中校
  • 技术积分: 1156
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-04 01:44
文章分类

全部博文(117)

文章存档

2012年(5)

2011年(5)

2010年(46)

2009年(61)

我的朋友

分类:

2009-08-30 09:57:37

Memory: 240K   Time: 0MS

解题思路

题意:

    求走遍所有的村庄最少的花费.村庄从A以字典序开始命名。

 

思路:

   最小生成树,prim算法。

   lowcost记录每次要走的最小的那条路,走一次更新一次。

最要注意的是输入很变态,用getchar+scanf TEL,一定要用cin

源程序

 

#include

#include <stdio.h>
#include <conio.h>
#define N 28
#define inf 0xffffff

using namespace std;
int g[N][N];
void prim(int n)
{
    int lowcost[N];
    int i, j, min, sum, minid;

    for(i=1; i<=n; i++)
        lowcost[i] = g[1][i];

    lowcost[1] = 0;    //这里我的模版本来用的1,导致后面错了,
    sum = 0;
    for(i=1; i<n; i++)
    {
        min = inf;
        minid = 0;
        for(j=1; j<=n; j++)
        {
            if(lowcost[j] < min && lowcost[j])  //影响到这里
            {
                min = lowcost[j];
                minid = j;
            }
        }
        if(minid)
        {
            sum += min;
            lowcost[minid] = 0;
            for(j=1; j<=n; j++)
            {
                if(g[minid][j] < lowcost[j])
                    lowcost[j] = g[minid][j];
            }
        }
    }
    printf("%d\n", sum);
}

int main()
{
    int i, j;
    int n, m, w;
    char ch, c;
    freopen("in.txt", "r", stdin);
    while(scanf("%d", &n) && n)
    {
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                g[i][j] = inf;
        for(i=1; i<n; i++)
        {
            cin >> ch >> m;
            while(m--)
            {
                cin >> c >> w;
                g[c - 'A'+1][ch - 'A'+1] = g[ch-'A'+1][c-'A'+1] = w;
            }
        }
        prim(n);
    }
    getch();
    return 0;
}

阅读(730) | 评论(0) | 转发(0) |
0

上一篇:poj 1797 Heavy Transportation

下一篇:kruskal算法2

给主人留下些什么吧!~~