keuskal 只能过一个,实在是自己找不出错误了
查看原帖
keuskal 只能过一个,实在是自己找不出错误了
275556
Lidaban楼主2020/5/17 10:58
#include <bits/stdc++.h>
using namespace std;
int f[5005];
struct node{
    int s,cost,to;
};
node Edge[200005];
bool cmp(node a,node b){
    return a.cost<b.cost;
}
/*int F(int a){
    int tf = f[a];
    if(f[tf] == tf)return tf;
    f[a] = F(tf);
    return f[a];
}
bool bc(int a,int b){
    if(F(a) == F(b)) return 1;
    f[b] = a;
    return 0;
}*/
int find(int x){
    while(x != f[x]) x = f[x] = f[f[x]];
    return x;
}
long long ans;
int main()
{
    int v,e,E;
    scanf("%d%d",&v,&e);
    for(int i = 1;i <= e; i++)
        scanf("%d%d%d",&Edge[i].s,&Edge[i].to,&Edge[i].cost);
    sort(Edge,Edge+e+1,cmp);
    int N = 1;
    for(int i = 1; i <= v; i++) f[i] = i;
    for(int i = 1; i <= e; i++){
        if(N == v){
            printf("%lld\n",ans);
            break;
        }
        if(find(Edge[i].s)==find(Edge[i].to)) continue;
        f[Edge[i].s] = Edge[i].to;
        N++;
        ans += Edge[i].cost;
    }
    //for(int i = 0 ;i < e;i++) printf("%d %d %d \n",Edge[i].s,Edge[i].to,Edge[i].cost);
    if(N != v) printf("orz");
    return 0;
}
2020/5/17 10:58
加载中...