HDU 5624 KK's Reconstruction

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5624 KK's Reconstruction相关的知识,希望对你有一定的参考价值。

这题目测是数据水了。我这种暴力写法显然是可以卡超时的。

假设有2000个点,15000条边,前面10000条不能构成树,后面5000条可以,这种数据显然可以卡超时。

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <stack>
#include <map>
#include <vector>
using namespace std;

const int maxn = 2000 + 10;
const int maxm = 15000 + 10;
const int inf = 0x7fffffff;
int T;
int n, m;
struct Edge
{
    int u;
    int v;
    int id;
    int val;
}e[maxm];
int fa[maxn];


bool cmp(const Edge&a, const Edge&b)
{
    return a.val<b.val;
}

void read()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++)
        scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].val);
    sort(e + 1, e + 1 + m, cmp);
}

int Find(int x)
{
    if (x != fa[x]) fa[x] = Find(fa[x]);
    return fa[x];
}

void work()
{
    int ans = inf;
    int i, j;
    int cnt;
    for ( i = 1; i <= m; i++)
    {
        for ( j = 1; j <= n; j++) fa[j] = j;
        cnt = n;
        for ( j = i; j <= m; j++)
        {
            int fu = Find(e[j].u);
            int fv = Find(e[j].v);
            if (fu == fv) continue;
            fa[fu] = fv; cnt--;
            if (cnt == 1)
            {
                ans = min(ans, e[j].val - e[i].val);
                break;
            }
        }
        if (cnt != 1) break;
    }

    if (ans == inf) ans = -1;
    printf("%d\n", ans);
}

int main()
{
    scanf("%d", &T);
    while (T--)
    {
        read();
        work();
    }
    return 0;
}

 

以上是关于HDU 5624 KK's Reconstruction的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5624 KK's Reconstruction(最小生成树)

hdu 5620 KK's Steel(推理)

HDU 5620 KK's Steel

hdu 5623 KK's Number(dp)

hdu 5621 KK's Point(数学,推理题)

HDU 5623 KK's Number(DP)