95pts求调
  • 板块P1340 兽径管理
  • 楼主CWzwz
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/26 18:15
  • 上次更新2023/11/26 20:27:36
查看原帖
95pts求调
265204
CWzwz楼主2023/11/26 18:15

Submission

//Problem: P1340
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define i32 INT_MAX
#define i64 LONG_LONG_MAX
#define pii std::pair<int, int>
#define pll std::pair<long long, long long>
#define pb push_back
#define fore(i,u,v) for(int i=head[u],v;i;i=e[i].nxt)
typedef long long ll;
const int N = 205, M = 6e3 + 10;
ll read(){ll x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;}
void print(ll x){if(x<0)putchar('-'),x=-x;if(x>9)print(x/10);putchar(x%10+48);}
char gc(){char c=getchar();while(c==' '||c=='\n')c=getchar();return c;}
void pc(char Char){std::putchar(Char);}

int n, m, head;

struct edge {
    int u, v, w, lst, nxt;
} e[M];
struct DSU {
    int rt[N];
    int find(int u) {
        if(rt[u] == u) return u;
        return rt[u] = find(rt[u]);
    }
    void merge(int u, int v) {
        rt[find(u)] = find(v);
    }
} dsu;

int kruskal() {
    int Count = 0, Sum = 0;
    for(int i = head; i; i = e[i].nxt) {
        int u = e[i].u, v = e[i].v, w = e[i].w;
        if(dsu.find(u) != dsu.find(v)) {
            Count++, Sum += w;
            dsu.merge(u, v);
            if(Count == n - 1) return Sum;
        }
    }
    if(Count == n - 1) return Sum;
    return -1;
}

int main() {
    std::cin >> n >> m;
    for(int i = 1; i <= m; i++) {
        int u, v, w;
        std::cin >> u >> v >> w;
        if(i > 1) {
            e[i].u = u, e[i].v = v, e[i].w = w;
            for(int j = head; j; j = e[j].nxt) {
                if(e[j].w >= w) {
                    e[e[j].lst].nxt = i;
                    e[i].lst = e[j].lst;
                    e[j].lst = i;
                    e[i].nxt = j;
                    if(j == head) head = i;
                    break;
                }
                if(e[j].nxt == 0) {
                    e[i].lst = j;
                }
            }
        } else {
            head = 1;
            e[1].u = u, e[1].v = v, e[1].w = w;
        }
        for(int j = 1; j <= n; j++) dsu.rt[j] = j;
        print(kruskal());
        pc('\n');
    }
    return 0;
}
2023/11/26 18:15
加载中...