BZOJ-2753: [SCOI2012]滑雪与时间胶囊(代码)

这道题的解法据说是按终边高度第一关键字,边长第二关键字排序,然后KRUSKAL最小生成树,但是本弱实在不懂怎么证明,求大神指教。

代码:

#include 

#include 

#include 

 

using namespace std;

 

#define MAXN 200001

#define MAXM 2000001

 

int father[MAXN];

int n,m;

int h[MAXN];

 

struct edge {

    int t,d;

    edge *next;

};

 

edge *head[MAXN],*P[MAXN];

 

void INSERT(int s,int t,int d){

    edge *p=new(edge);

    p->t=t;

    p->d=d;

    p->next=head[s];

    head[s]=p;

}

 

bool flag[MAXN];

 

void dfs(int v){

    flag[v]=false;

    for (P[v]=head[v];P[v];P[v]=P[v]->next){

        if (flag[P[v]->t]){

            dfs(P[v]->t);

        }

    }

}

 

struct node {

    int s,t,d,h;

} Edge[MAXM];

 

node Node(int s,int t,int d,int h){

    node w;

    w.s=s;

    w.t=t;

    w.d=d;

    w.h=h;

    return w;

}

 

int M=0;

 

bool cmp(node x,node y){

    if (x.h>y.h){

        return true;

    }

    if (x.h=h[t]){

            INSERT(s,t,d);

        }

        if (h[t]>=h[s]){

            INSERT(t,s,d);

        }

    }

    memset(flag,true,sizeof(flag));

    dfs(1);

    int maxv=0;

    long long cost=0;

    for (int i=0;i++next){

                Edge[++M]=Node(i,p->t,p->d,h[p->t]);

            }

        }

    }

    sort(Edge+1,Edge+M+1,cmp);

    int count=0;

    for (int i=0;i++=maxv-1){

                break;

            }

        }

    }

    printf("%d %lld\n",maxv,cost);

    return 0;

}


你可能感兴趣的:(BZOJ-2753: [SCOI2012]滑雪与时间胶囊(代码))