nyoj 925 国王的烦恼(最小生成树)

简介:

/*
    题意:N个城市中每两个城市有多条路径连接,可是因为路径存在的天数是有限的!以为某条路经不存在了
    导致N个城市不能连通了,那么村名们就会抗议!问一共会有多少次抗议!
    
    思路:最小生成树....我们用最大边来建立树!只要有最大边将节点连接并保证连通!那么边权小的值
    就可以忽略了!最后将生成树中由(最大边组成的)去重(相同的值只有一次抗议)!这时剩下边的数值就是
    答案了! 
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define M 10005
#define N 100005
using namespace std;
struct EDGE{
   int u, v, tt;       
};

int f[N];
int n, m;
int getFather(int x){
   return x==f[x] ? x:f[x]=getFather(f[x]);    
}

bool Union(int a, int b){
    int fa=getFather(a), fb=getFather(b);
    if(fa!=fb){
       f[fa]=fb;
       return true;
    }     
    return false;
}

bool cmp(EDGE a, EDGE b){
   return a.tt > b.tt;
}

EDGE edge[N];
int xx[N];
int main(){
   while(scanf("%d%d", &n, &m)!=EOF){
        for(int i=1; i<=n; ++i)
           f[i]=i;
        for(int i=0; i<m; ++i)
           scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].tt);                                
        sort(edge, edge+m, cmp);//将边权按照从大到小排序! 
        int cnt=0;
        for(int i=0; i<m; ++i)
           if(Union(edge[i].u, edge[i].v)) 
              xx[cnt++]=edge[i].tt;
        cnt=unique(xx, xx+cnt)-xx;//去重 
        printf("%d\n", cnt);
   }
   return 0;    
}

目录
相关文章
|
7月前
|
算法 测试技术 C#
【广度优先搜索】【分类讨论】900. 最佳运动员的比拼回合
【广度优先搜索】【分类讨论】900. 最佳运动员的比拼回合
|
2月前
|
算法 Java 调度
【贪心算法】 藏匿的刺客(C/C++)
【贪心算法】 藏匿的刺客(C/C++)
|
7月前
NYOJ-757-期末考试
NYOJ-757-期末考试
26 0
|
7月前
|
算法
讲课:拓扑排序、最短路算法
讲课:拓扑排序、最短路算法
|
算法
【过河卒】回溯算法保姆式解题
【过河卒】回溯算法保姆式解题
98 0
|
存储 算法 调度
【喜闻乐见,包教包会】二分图最大匹配:匈牙利算法(洛谷P3386)
【喜闻乐见,包教包会】二分图最大匹配:匈牙利算法(洛谷P3386)
84 0
|
机器学习/深度学习
带你轻松拿捏N皇后问题
要求任何两个皇后不同行、不同列,也不在同一 条斜线上
138 0
带你轻松拿捏N皇后问题
|
算法 C++
蓝桥杯(聪明的猴子)克鲁斯卡尔算法最小生成树
蓝桥杯(聪明的猴子)克鲁斯卡尔算法最小生成树
108 0
|
机器学习/深度学习 算法
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
|
算法
贪心算法——小船过河
贪心算法——小船过河
391 0
贪心算法——小船过河