hdu 3371 Connect the Cities(最小生成树)

简介:

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3371

984ms风险飘过~~~

复制代码
/************************************************************************/
/*     
        hdu  Connect the Cities
        最小生成树
        题目大意:最小生成树,题目很长,题意很简单就是最小生成树。关键是构建图
*/
/************************************************************************/

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>

#define MAX 0xfffffff

const int N = 501;
int map[N][N];
int vis[N];
int mark[N];
int num,n;

void build_map()
{
    int m,k;
    int q,p,c;
    int t;

    scanf("%d%d%d",&n,&m,&k);
    for (int i = 1; i <= n; i++)
    for (int j = i; j <= n; j++)
    map[i][j] = map[j][i] = ((i==j)?0:MAX);

    for (int i = 0; i < m; i++)
    {
        scanf("%d%d%d",&p,&q,&c);
        if (map[p][q] > c)
        {
            map[p][q] = map[q][p] = c;
        }
        
    }
    while(k--)
    {
        scanf("%d",&t);
        for (int i = 0; i < t; i++)
        {
            scanf("%d",&mark[i]);
            for (int j = 0; j < i; j++)
            {
                map[mark[j]][mark[i]] = map[mark[i]][mark[j]] = 0;
            }
        }
    }
}

int prim()
{
    int t = n;
    int sum = 0;
    int min,k;
    vis[0] = 1;
    while(--t)
    {
        min = MAX;
        for(int i = 2; i <= n; i++)
        {
            if (vis[i] != 1 && map[1][i] < min)
            {
                min = map[1][i];
                k = i;
            }
        }
        if(min == MAX)break;
        vis[k] = 1;
        sum += min;
        for (int i = 2; i <= n; i++)
        {
            if (vis[i] != 1 && map[k][i] < map[1][i])
            map[1][i] = map[k][i];
        }
    }
    return t==0?sum:-1;
}


int main()
{
    scanf("%d",&num);
    while(num--)
    {
        build_map();
        memset(vis,0,sizeof(vis));
        printf("%d\n",prim());
    }
    return 0;
}
复制代码

 









本文转自NewPanderKing51CTO博客,原文链接:http://www.cnblogs.com/newpanderking/p/3253094.html ,如需转载请自行联系原作者

相关文章
|
机器学习/深度学习 测试技术
UVA11175 有向图D和E From D to E and Back
UVA11175 有向图D和E From D to E and Back
UVA11175 有向图D和E From D to E and Back
|
算法 机器学习/深度学习
|
算法
【POJ 3009 Curling2.0 迷宫寻径 DFS】
http://poj.org/problem?id=3009 模拟冰壶的移动,给出到达终点的最少投掷次数(不可达时为-1)。 具体移动规则如下: 每次选四个方向之一,沿此方向一直前进,直到撞到block或出界或抵达目标位置。
974 0
【POJ 1679 The Unique MST】最小生成树
无向连通图(无重边),判断最小生成树是否唯一,若唯一求边权和。 分析生成树的生成过程,只有一个圈内出现权值相同的边才会出现权值和相等但“异构”的生成树。(并不一定是最小生成树) 分析贪心策略求最小生成树的过程(贪心地选最短的边来扩充已加入生成树的顶点集合U),发现只有当出现“U中两个不同的点到V-U中同一点的距离同时为当前最短边”时,才会出现“异构”的最小生成树。
1207 0
【HDU 4786 Fibonacci Tree】最小生成树
一个由n个顶点m条边(可能有重边)构成的无向图(可能不连通),每条边的权值不是0就是1。 给出n、m和每条边的权值,问是否存在生成树,其边权值和为fibonacci数集合{1,2,3,5,8...}中的一个。
1026 0