hdu 1232 畅通工程

简介: 点击打开链接hdu 1232 思路:最小生成树 + 并查集 分析:简单的最小生成树的题目,直接上模板即可。或直接并查集 /*法一:*/#include#include#include#includeusing namesp...

点击打开链接hdu 1232


思路:最小生成树 + 并查集

分析:简单的最小生成树的题目,直接上模板即可。或直接并查集


/*法一:*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 1010

int n , m;
int father[MAXN];/*存储节点的父亲节点*/
int rank[MAXN];/*存储根节点的儿子节点的个数*/
struct Edge{
   int x;   
   int y;
}e[MAXN];

/*并查集的初始化*/
void init_Set(){
     for(int i = 0 ; i < MAXN ; i++){
        father[i] = i;
        rank[i] = 0;
     }
}

/*递归查找*/
int Find_Set(int x){
    if(father[x] != x)
       father[x] = find_Set(father[x]); 
    return father[x];
}

/*集合的合并*/
void Union(int root_x ,int root_y){
     if(rank[root_x] > rank[root_y])
        father[root_y] = root_x;
     else{
        if(rank[root_x] == rank[root_y]) 
            rank[root_y]++;
        father[root_x] = root_y;
     }
}

void solve(){
     int ans = 0;
     init_Set();/*初始化并查集*/
     for(int i = 0 ; i < m ; i++){   
        int root_x = Find_Set(e[i].x);
        int root_y = Find_Set(e[i].y);
        if(root_x != root_y){
           ans++;
           Union(root_x , root_y);
        }
     }
     printf("%d\n" , n-1-ans);
}

int main(){
    while(scanf("%d%d" , &n , &m) , n){
        for(int i = 0 ; i < m ; i++)
           scanf("%d%d" , &e[i].x , &e[i].y);
        solve();
    }
    return 0;
}


/*法二:*/
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 0xFFFFFFF
#define MAXN 1010

int G[MAXN][MAXN];
int lowcost[MAXN];
int vis[MAXN];
int n , m , ans;

/*Prime算法的模板*/
void Prime(){
         int pos , min;
         ans = 0;
         memset(vis , 0 , sizeof(vis));/*初始化为0*/
         vis[1] = 1;/*第一个点标记为1*/
         for(int i = 1 ; i <= n ; i++)/*初始化lowcost数组*/
               lowcost[i] = G[1][i];
         for(int i = 1 ; i <= n ; i++){/*枚举n个顶点*/
               min = INF;/*初始化为INF*/
               for(int j = 1 ; j <= n ; j++){/*找到最小权边对应顶点*/
                     if(!vis[j] && min > lowcost[j]){
                          min = lowcost[j];
                          pos = j;
                     }
               }
               if(min == INF)/*如果min = INF表示已经不再有点可以加入最小生成树中*/
                   break;
               ans += min;
               vis[pos] = 1;/*加入最小生成树中*/
               for(int j = 1 ; j <= n ; j++){/*更新可更新边的权值*/
                     if(!vis[j] && lowcost[j] > G[pos][j])/*更新lowcost*/
                          lowcost[j] = G[pos][j];
            } 
         }
         printf("%d\n" , ans);
}

int main(){
    //freopen("input.txt" , "r" , stdin);
    int a , b;
    while(scanf("%d%d" , &n , &m) , n){
         for(int i = 1 ; i <= n ; i++){
            for(int j = 1 ; j <= n ; j++)
               G[i][j] = 1;
         }
         for(int i = 0 ; i < m ; i++){
            scanf("%d%d" , &a , &b);
            G[a][b] = G[b][a] = 0;
         }
         Prime();   
    }
    return 0;
}





 


目录
相关文章
|
9月前
|
Java
hdu-2546-饭卡
hdu-2546-饭卡
36 0
|
9月前
|
Java
HDU-4552-怪盗基德的挑战书
HDU-4552-怪盗基德的挑战书
62 0
畅通工程 HDU - 1232
畅通工程 HDU - 1232
89 0
HDU 2669 Romantic
题意:找出最小的非负整数X,使之满足式子X*a + Y*b = 1。
120 0
|
C++
HDU1862
中文题,题意挺好理解,不过多赘述。
1282 0
|
机器学习/深度学习
HDOJ/HDU 2568 前进(简单题)
Problem Description 轻松通过墓碑,进入古墓后,才发现里面别有洞天。 突然,Yifenfei发现自己周围是黑压压的一群蝙蝠,个个扇动翅膀正准备一起向他发起进攻! 形势十分危急! 好在此时的yifenfei已经不是以前那个经常被lemon抢走MM的菜鸟了!面对众多蝙蝠的嗜血狂攻,只见yifenfei使出轻灵的剑法,刷,刷,刷,瞬间搞定…… 现已知yifenfei使用了2招(剑招A和剑招B):剑招A,一招能杀死一半的蝙蝠。
990 0
|
机器学习/深度学习
hdu 2604 Queuing
点击打开hdu 2604 思路: 递推+矩阵快速幂 分析; 1 根据题目的意思,我们可以求出F[0] = 0 , F[1] = 2 , F[2] = 4 , F[3] = 6 , F[4] = 9 , F[5] = 15 2 那么根据上面...
814 0