bzoj1977(未写完题解)

来源:互联网 发布:硬盘录像机端口 编辑:程序博客网 时间:2024/05/17 16:03

调了那么久就是因为

    pro=max(pro,sec(ans1,fmax[u][0],fmax[v][0]));//shunxu!!!    ans1=max(ans1,max(fmax[u][0],fmax[v][0]));    ans2=max(ans2,max(smax[u][0],smax[v][0]));    ans2=max(pro,ans2);

最后一步pro的语序错了

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define ll long longconst int M=300000+5,N=100000+5,P=16;int fa[N],nxt[M],to[M],head[N],w[M],etot;bool exi[M];int fmax[N][P+1],smax[N][P+1],anc[N][P+1],dep[N];struct edge{    int u,v,w;}e[M];int sec(int a,int b,int c){    if((a<=b&&a>=c)||(a>=b&&a<=c)) return a;    if((b<=c&&b>=a)||(b<=a&&b>=c)) return b;    if((c<=a&&c>=b)||(c<=b&&c>=a)) return c; }void adde(int u,int v,int c){    to[++etot]=v;    w[etot]=c;    nxt[etot]=head[u];    head[u]=etot;}int cmp(edge a,edge b){    return a.w<b.w;}int getfa(int x){    return fa[x]==x?x:fa[x]=getfa(fa[x]);}void merge(int u,int v){    int pa=getfa(u),pb=getfa(v);    fa[pa]=pb;}void dfs(int u,int fa){    dep[u]=dep[fa]+1;    anc[u][0]=fa;    for(int p=1;p<=P;p++){        anc[u][p]=anc[anc[u][p-1]][p-1];        fmax[u][p]=max(fmax[u][p-1],fmax[anc[u][p-1]][p-1]);        smax[u][p]=max(max(smax[u][p-1],smax[anc[u][p-1]][p-1]),min(fmax[u][p-1],fmax[anc[u][p-1]][p-1]));    }    for(int i=head[u];i;i=nxt[i]){        int v=to[i];        if(v==fa) continue;        fmax[v][0]=w[i];        smax[v][0]=-1;        dfs(v,u);    }}void query(int u,int v,int &ans1,int &ans2){    int pro=-1;     if(dep[u]<dep[v]) swap(u,v);    int t=dep[u]-dep[v];    for(int p=0;t;t>>=1,p++)    if(t&1){        ans1=max(ans1,fmax[u][p]);        ans2=max(ans2,smax[u][p]);        u=anc[u][p];//shunxu!!    }     if(u==v) return;    for(int p=P;p>=0;p--)    if(anc[u][p]!=anc[v][p]) {        pro=max(pro,sec(ans1,fmax[u][p],fmax[v][p]));        ans1=max(ans1,max(fmax[u][p],fmax[v][p]));        ans2=max(ans2,max(smax[u][p],smax[v][p]));        u=anc[u][p],v=anc[v][p];    }    //沿途再求一个fmax的第二 和smax的第一相比     pro=max(pro,sec(ans1,fmax[u][0],fmax[v][0]));//shunxu!!!    ans1=max(ans1,max(fmax[u][0],fmax[v][0]));    ans2=max(ans2,max(smax[u][0],smax[v][0]));    ans2=max(pro,ans2);}int main(){    int n,m;    int tot=0;ll val=0;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++) fa[i]=i;    for(int i=1;i<=m;i++)        scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);    sort(e+1,e+1+m,cmp);    for(int i=1;i<=m;i++){        if(getfa(e[i].u)!=getfa(e[i].v)){            adde(e[i].u,e[i].v,e[i].w);            adde(e[i].v,e[i].u,e[i].w);            exi[i]=1;            merge(e[i].u,e[i].v);            val=val+1ll*e[i].w;            if(++tot==n-1) break;        }    }//  printf("val:%I64d\n",val);    dfs(1,1);    int del=1e9;    for(int i=1;i<=m;i++)    if(!exi[i]){        int fans=-1,sans=-1;        query(e[i].u,e[i].v,fans,sans);        if(fans!=e[i].w)            del=min(del,e[i].w-fans);        if(sans!=e[i].w&&sans!=-1)            del=min(del,e[i].w-sans);    }    val=val+del;    printf("%lld",val);//bzoj lld    return 0;}
原创粉丝点击