HDU 1102 Constructing Roads (最小生成树)

最小生成树模板(嗯……在kuangbin模板里面抄的……)

最小生成树(prim)
/** Prim求MST
  * 耗费矩阵cost[][],标号从0开始,0~n-1
  * 返回最小生成树的权值,返回-1表示原图不连通
  */
const int INF = 0x3f3f3f3f;
const int MAXN = 110;

bool vis[MAXN];
int lowc[MAXN];
int map[MAXN][MAXN];

int Prim(int cost[][MAXN], int n)
{
    int ans = 0;
    memset(vis, false, sizeof(vis));
    vis[0] = true;
    for (int i = 1; i < n; ++i) lowc[i] = cost[0][i];
    for (int i = 1; i < n; ++i) {
        int minc = INF;
        int p = 1;
        for (int j = 0; j < n; ++j)
            if (!vis[j] && minc > lowc[j]) {
                minc = lowc[j];
                p = j;
            }
        if (minc == INF) return -1;
        ans += minc;
        vis[p] = true;
        for (int j = 0; j < n; ++j)
            if (!vis[j] && lowc[j] > cost[p][j])
                lowc[j] = cost[p][j];
    }
    return ans;
}

感觉Prim和Dijkstra有点像。写起来挺简单的。

我一开始的想法是把每个q中的a,b设为已访问节点,后来发现不对,例如ab连,dc连,但它们并不是全部相连的。

好吧其实此题就是把已建好两点之间距离设为0.

//Problem : 1102 ( Constructing Roads )     Judge Status : Accepted
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int N = 105;
const int INF = 3000;

int map[N][N];
int vis[N];
int dis[N];

int Prim(int n)
{
    int ans = 0;
    memset(vis, 0, sizeof(vis));
    for (int j = 1; j <= n; ++j) {
        dis[j] = map[1][j];
    }
    for (int k = 1; k <= n; ++k) {
        int minc = INF;
        int p = 1;
        for (int i = 1; i <= n; ++i) {
            if (!vis[i] && dis[i] < minc) {
                minc = dis[i];
                p = i;
            }
        }
        if (minc == INF) return -1;
        ans += minc;
        vis[p] = 1;
        for (int j = 1; j <= n; ++j) {
            if (map[p][j] < dis[j] && !vis[j])
                dis[j] = map[p][j];
        }
    }
    return ans;
}

int main()
{
    int n, q;
    while (cin >> n) {
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                cin >> map[i][j];
        cin >> q;
        int a, b;
        for (int i = 0; i < q; ++i) {
            cin >> a >> b;
            map[a][b] = map[b][a] = 0;
        }
        cout << Prim(n) << endl;
    }
    return 0;
}

  

时间: 2024-10-21 10:07:16

HDU 1102 Constructing Roads (最小生成树)的相关文章

hdu 1102 Constructing Roads 最小生成树Prim算法AC 水~~~

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15230    Accepted Submission(s): 5826 Problem Description There are N villages, which are numbered from 1 to N, and you should

hdu 1102 Constructing Roads(最小生成树 Prim)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Problem Description There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are conne

HDU 1102 Constructing Roads, Prim+优先队列

题目链接:HDU 1102 Constructing Roads Constructing Roads Problem Description There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are conne

HDU 1102 Constructing Roads (裸的并查集)

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13210    Accepted Submission(s): 4995 Problem Description There are N villages, which are numbered from 1 to N, and you should

hdu 1102 Constructing Roads (最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14172    Accepted Submission(s): 5402 Problem Description There are N villa

hdu 1102 Constructing Roads (Prim算法)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 21947    Accepted Submission(s): 8448 Problem Description There are N villa

HDU 1102 Constructing Roads【简单最小生成树,Prime算法+Kruskal算法】

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20765    Accepted Submission(s): 7934 Problem Description There are N villages, which are numbered from 1 to N, and you should

HDU - 1102 - Constructing Roads (最小生成树--prim算法!!)

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14890    Accepted Submission(s): 5674 Problem Description There are N villages, which are numbered from 1 to N, and you should

hdu 1102 Constructing Roads Kruscal

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 题意:这道题实际上和hdu 1242 Rescue 非常相似,改变了输入方式之后, 本题实际上更适合用Prim来做. 用Kruscal的话要做一些变化. /*Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s)