荒天帝


私信TA

用户名:ljhabc

访问量:3070

签 名:

等  级
排  名 426
经  验 4774
参赛次数 1
文章发表 126
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:

注意事项:

参考代码:

#include<bits/stdc++.h> 

using namespace std;

 

const int Max_N = 1e4+10;

const int Max_M = 1e5+10;

 

struct Brige

{

    int u,v;

    int day;

    Brige(){}

    Brige(int u_,int v_,int day_)

    {

        u = u_; v = v_; day = day_;

    }

}brige[Max_M];

 

int n,m;

int cur_day;

int par[Max_N];

int height[Max_N];

void init(int n);

int find(int x);

void unite(int x, int y);

bool same(int x, int y);

void solve();

bool cmp(const Brige &b1, const Brige &b2);

 

int main()

{

    scanf("%d%d",&n,&m);

    for( int i=0; i<m; i++ )

    {

        scanf("%d%d%d",&brige[i].u,&brige[i].v,&brige[i].day);

        cur_day = max( cur_day, brige[i].day);

    }

     

    solve();

     

    return 0;

}

 

void init(int n)

{

    for( int i=1; i<=n; i++ )

    {

        par[i] = i;

        height[i] = 0;

    }

}

 

int find( int x )

{

    return x==par[x] ? x : par[x] = find(par[x]);

}

 

void unite(int x, int y)

{

    x = find(x); y = find(y);

    if( x==y )

        return;

    if( height[x]<height[y] )

    {

        par[x] = y;  

    } 

    else

    {

        par[y] = x;

        if( height[x]==height[y] )    height[x]++;

    }

}

 

bool same(int x, int y)

{

    return find(x)==find(y);

}

 

bool cmp(const Brige &b1, const Brige &b2)

{

    return b1.day>b2.day;// 用>=作为条件会出错,原因是?

}

 

void solve()

{

    init(n);

    sort(brige,brige+m,cmp);

     

    int i = 0, ans = 0;

    bool flag;

    while( cur_day>0 && i<m )

    {

        flag = false;

        for( ; i<m; i++ )

        {

            if( cur_day != brige[i].day )

            {

                cur_day = brige[i].day;

                break;

            }

            int u = brige[i].u, v = brige[i].v;

            bool temp = same(u,v);

            unite(u,v);

            if( flag )    continue;

            if( temp^same(u,v) )

            {

                ans++;  flag = true;

            }

        }

    }

    printf("%d\n",ans);

}


 

0.0分

3 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

好!
2023-03-04 22:04:33
  • «
  • 1
  • »