fzu Problem 2087 统计树边 (kruskal)

注意处理边相同时  

#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector> 
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
#include <iomanip>
using namespace std;
#define LL long long 
#define N 100100

int n,m;

struct node{
    int u,v,w;
}e[N];

struct ufind{
    int f[N];
    void init(int x) { for(int i=0;i<=x;i++) f[i]=i;}
    int find(int x) { return f[x]==x?x:f[x]=find(f[x]);}

    void set_friend(int i,int j){ f[find(i)]=find(j);}
    bool is_friend(int i,int j){
        return find(i)==find(j) ? 1:0;
    }
}uf;

bool cmp(node a,node b){
    return a.w<b.w;
}
int kruskal(){
    sort(e,e+m,cmp);
    uf.init(n);
    int pre=-1,sum=0;
    for(int i=0;i<=m;i++){
        if(pre!=-1&&e[pre].w!=e[i].w){
            /*cout<<pre<<" "<<i<<endl;*/
            /*cout<< uf.f[e[i].u]<<" "<<uf.f[e[i].v]<<endl;*/
            for(;pre!=i;pre++){
                if(!uf.is_friend(e[pre].u,e[pre].v))
                    uf.set_friend(e[pre].u,e[pre].v);
            }
            pre=-1;
        }
        if( !uf.is_friend(e[i].u,e[i].v)){
            if(pre==-1) pre=i;    
            sum++;
        }
    }
    /*for(int i=1;i<=n;i++) cout<<uf.f[i]<<" "<<endl;*/
    return sum;
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m); 
        e[m].w=INT_MAX;
        for(int i=0;i<m;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            e[i].u=u; e[i].v=v; e[i].w=w;
        }
        printf("%d\n",kruskal());
    }
}
posted @ 2012-05-02 17:30  HaoHua_Lee  阅读(279)  评论(0编辑  收藏  举报