zoukankan      html  css  js  c++  java
  • BZOJ4158 : [POI2007]Railway

    论文题。

    随便取个关键点,求出最短路树。

    求出所有关键点组成的虚树,将两端都在虚树上的边保留。

    对剩下的边求出最小生成树即可得到一组可行解。

    #include<cstdio>
    #include<algorithm>
    const int N=5010,M=500010,inf=~0U>>1;
    int n,m,p,i,x,f[N],id[N],ans,cnt,use[M];
    int q[131072],in[N],d[N],pre[N];unsigned short h,t;
    struct Edge{int v,w;Edge*nxt;}*g[N],pool[M<<1],*cur=pool,*I;
    inline void add(int x,int y,int z){I=cur++;I->v=y;I->w=z;I->nxt=g[x];g[x]=I;}
    struct E{int x,y,z;}e[M];
    inline bool cmp(E a,E b){return a.z<b.z;}
    inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
    int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
    int main(){
      for(read(n),read(m);i<m;i++){
        read(e[i].x),read(e[i].y),read(e[i].z);
        add(e[i].x,e[i].y,e[i].z);
        add(e[i].y,e[i].x,e[i].z);
      }
      for(read(p),i=1;i<=p;i++)read(id[i]);
      for(i=1;i<=n;i++)d[i]=inf;
      d[q[0]=id[1]]=0,in[id[1]]=1;
      while(h!=t+1)for(I=g[x=q[h++]],in[x]=0;I;I=I->nxt)if(d[x]+I->w<d[I->v]){
        d[I->v]=d[x]+I->w,pre[I->v]=x;
        if(!in[I->v]){
          in[I->v]=1;
          if(d[I->v]<d[q[h]])q[--h]=I->v;else q[++t]=I->v;
        }
      }
      for(in[id[1]]=i=1;i<=p;i++)for(x=id[i];!in[x];x=pre[x])in[x]=1;
      for(i=1;i<=n;i++)f[i]=i;
      for(std::sort(e,e+m,cmp),i=0;i<m;i++)if(in[e[i].x]&&in[e[i].y]&&F(e[i].x)!=F(e[i].y)){
        f[f[e[i].x]]=f[e[i].y];
        ans+=e[i].z,cnt++,use[i]=1;
      }
      for(printf("%d %d
    ",ans,cnt),i=0;i<m;i++)if(use[i])printf("%d %d
    ",e[i].x,e[i].y);
      return 0;
    }
    

      

  • 相关阅读:
    关于Faster-RCNN训练细节
    tensorflow 使用tfrecords创建自己数据集
    深度学习(tensorflow) —— 自己数据集读取opencv
    Tensorflow常见函数case argmax equal
    pandas dataframe类型操作
    celery 启动命令
    pipenv 虚拟环境新玩法
    拉取远程分支
    odoo 开发 context 上下文的用法
    odoo 二次开发的方法
  • 原文地址:https://www.cnblogs.com/clrs97/p/4614662.html
Copyright © 2011-2022 走看看