比赛 NOIP水题争霸赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 最小差异值 最终得分 100
用户昵称 313 运行时间 2.621 s
代码语言 C++ 内存使用 0.27 MiB
提交时间 2018-02-11 21:31:25
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define il inline
#define db double
using namespace std;
il int gi()
{
    int x=0,y=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
        y=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*y;
}
il ll gl()
{
    ll x=0,y=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
        y=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*y;
}
struct edge
{
    int a,b;
    ll dis;
}e[5045];
bool cmp(edge x,edge y)
{
    return x.dis<y.dis;
}
int fa[5045];
int find(int x)
{
    if(fa[x]!=x)
    fa[x]=find(fa[x]);
    return fa[x];
}
int n,m,x,y,z,now;
il bool hzr(int x,int y)
{
    for(int i=1;i<=n;i++)
    fa[i]=i;
    for(int i=x;i<=y;i++)
    {
        int r1=find(e[i].a),r2=find(e[i].b);
        if(r1!=r2)
        {
            now++;
            fa[r2]=r1;
        }
    }
}
int main()
{
    freopen("dvalue.in","r",stdin);
    freopen("dvalue.out","w",stdout);
    n=gi(),m=gi();
    for(int i=1;i<=m;i++)
    {
        x=gi(),y=gi(),z=gl();
        e[i].a=x;
        e[i].b=y;
        e[i].dis=z;
    }
    sort(e+1,e+1+m,cmp);
    ll minx=1e16;
    for(int i=1;i<=m-n+2;i++)
    {
        now=0;
        hzr(i,i+n-2);
        if(now==n-1)
        {
            if(e[i+n-2].dis-e[i].dis<minx)
            minx=e[i+n-2].dis-e[i].dis;
            continue;
        }
        for(int j=i+n-1;j<=m;j++)
        {
            int r1=find(e[j].a),r2=find(e[j].b);
            if(r1!=r2)
            {
                now++;
                fa[r2]=r1;
            }
            if(now==n-1)
            {
                if(e[j].dis-e[i].dis<minx)
                    minx=e[j].dis-e[i].dis;
                break;
            }
        }
    }
    printf("%lld\n",minx);
    return 0;
}