保留道路

来源:互联网 发布:软件安装管家 编辑:程序博客网 时间:2024/05/01 20:22

广告

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#include<map>#define LL long long#define MOD 1000000007using namespace std;struct nico{    LL ss,gg,pu,pv,vis;}road[50005],q[50005],nowq[50005];LL len,n,m,wg,sw,cnt,tot,p1,p2,f1,f2,sum,u,v,g,s,f[50005],num[50005],end[50005],ans=1e16,maxs;bool comp(nico a,nico b){    return a.gg<b.gg;   }void Insert(nico a){    int i;    if(len==0)    {        len++;        q[1]=a;        return;    }    if(a.ss>q[len].ss)    {        len++;        q[len]=a;        return;    }    for(i=len;i>=1;i--)    {        if(q[i].ss>a.ss) {q[i+1]=q[i];q[i]=a;}        else break;    }    len++;}LL find(LL x){    LL tmp;    if(f[x]==x) return x;    tmp=find(f[x]);    f[x]=tmp;    return tmp;}int main(){    freopen("road.in","r",stdin);    freopen("road.out","w",stdout);    int i,j;    scanf("%lld%lld%lld%lld",&n,&m,&wg,&sw);    for(i=1;i<=m;i++)    {        scanf("%lld%lld%lld%lld",&u,&v,&g,&s);        road[i].gg=g;        road[i].ss=s;        road[i].pu=u;               road[i].pv=v;       }    sort(road+1,road+m+1,comp);    for(i=1;i<=m;i++)    {           if(wg*road[i].gg+sw*road[i].ss>ans) continue;        Insert(road[i]);        tot=0;maxs=0;        for(j=1;j<=n;j++) f[j]=j;               for(j=1;j<=len;j++)            nowq[j]=q[j],nowq[j].vis=0;         for(j=1;j<=len;j++)        {            p1=q[j].pu;            p2=q[j].pv;            f1=find(p1);            f2=find(p2);            if(f1!=f2)            {                tot++;                f[f1]=f2;                nowq[j].vis=1;                maxs=max(maxs,q[j].ss);            }        }        if(tot==n-1)         {            sum=0;            for(j=1;j<=len;j++)                if(nowq[j].vis) q[++sum]=nowq[j];            len=sum;            ans=min(ans,wg*road[i].gg+sw*maxs);         }    }    printf("%lld",ans);    return 0;}