2017.9.21 道路修建(noi2011) 思考记录

来源:互联网 发布:php 析构函数的用法 编辑:程序博客网 时间:2024/06/07 08:54

这个题,,dfs即可

但听说dfs会爆栈,还会被卡、

所以就写了一个拓扑、

noi2011很良心啊



码(不知为何,非常的慢):

#include<cstdio>#include<cstring>using namespace std;#include<queue>#include<cmath>#define N 1000006#define ll long longqueue<int>q;int bian[N][3],tot,hou[N<<1],xia[N],zhong[N<<1],v[N<<1],rd[N],n,i,x,y,z,f[N],sd[N];bool vis[N];ll ans;void jian(int a,int b,int c){++tot,hou[tot]=xia[a],xia[a]=tot,zhong[tot]=b,v[tot]=c;rd[b]++;}void jia(int a,int b,int c){jian(a,b,c);jian(b,a,c);}int main(){memset(xia,-1,sizeof(xia));scanf("%d",&n);for(i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);jia(x,y,z);bian[i][0]=x;bian[i][1]=y;bian[i][2]=z;}for(i=1;i<=n;i++){f[i]=1;sd[i]=1;if(rd[i]==1)q.push(i),vis[i]=1;}while(!q.empty()){int st=q.front();q.pop();for(i=xia[st];i!=-1;i=hou[i]){int nd=zhong[i];if(vis[nd])continue;    f[nd]+=f[st];    sd[nd]=max(sd[nd],sd[st]+1);rd[nd]--;if(rd[nd]==1){q.push(nd);vis[nd]=1;}}}for(i=1;i<n;i++){if(sd[bian[i][0]]>sd[bian[i][1]])swap(bian[i][0],bian[i][1]);ans+=1ll*fabs(n-2*f[bian[i][0]])*1ll*bian[i][2];}printf("%lld",ans);}


原创粉丝点击