zoukankan      html  css  js  c++  java
  • 斯坦纳树

    #line 5 "FoxTheLinguist.cpp"
    #include <bits/stdc++.h>
    using namespace std;
    
    int head,tail,n,dl[10001],indl[10001],nxt[10001],len[10001],dis[3501][110],nd[10001],des[10001],cnt;
    char st[1000001];
    
    void spfa(int dis[]){
      head=1;tail=0;
      for (int i=0;i<=n*10;i++) dl[++tail]=i,indl[i]=1;
      while (head<=tail){
          for (int p=nd[dl[head]];p!=-1;p=nxt[p])
            if (dis[des[p]]>dis[dl[head]]+len[p]){
              dis[des[p]]=dis[dl[head]]+len[p];
              if (!indl[des[p]]){
                dl[++tail]=des[p];
              indl[des[p]]=1;
            }
          }
        indl[dl[head++]]=0;
      }
    }
    
    void Steiner(){
      for (int i=0;i<=n*10;i++) for (int j=0;j<=(1<<(n+1))-1;j++) dis[j][i]=1e9;
      dis[1][0]=0;
      for (int i=1;i<=n;i++) dis[1<<i][i*10]=0;
      for (int mask=1;mask<=(1<<(n+1))-1;mask++){
        for (int j=0;j<=10*n;j++)
          for (int k=(mask-1)&mask;k;k=(k-1)&mask)
            dis[mask][j]=min(dis[mask][j],dis[k][j]+dis[mask-k][j]);
        
        spfa(dis[mask]);
      }
    }
    
    void addedge(int x,int y,int le){
      nxt[++cnt]=nd[x];des[cnt]=y;len[cnt]=le;nd[x]=cnt;
    }
    
    class FoxTheLinguist {
        public:
        int minimalHours(int N, vector <string> I) {
          n=N;             
          for (int i=0;i<=10*n;i++) nd[i]=-1;
          for (int i=1;i<=n;i++) addedge((i-1)*10+1,0,0);
          for (int i=1;i<=n;i++)
            for (int j=10;j>2;j--)     
              addedge((i-1)*10+j-1,(i-1)*10+j,0);    
          cnt=-1;
          for (int i=0;i<I.size();i++)
            for (int j=0;j<I[i].size();j++)
              st[++cnt]=I[i][j];
                                                    
          int po=0;                        
          while (st[po]>='A'&&st[po]<='Z'){
              int poa=(st[po]-'A')*10+st[po+1]-'0'+1,pob=(st[po+4]-'A')*10+st[po+5]-'0'+1,num=(st[po+7]-'0')*1000+(st[po+8]-'0')*100+(st[po+9]-'0')*10+(st[po+10]-'0');
              addedge(pob,poa,num);
              po+=12;
          }
          
          Steiner();
          
          if (dis[(1<<(n+1))-1][0]==1e9) return(-1);else return(dis[(1<<(n+1))-1][0]);
        } 
        
  • 相关阅读:
    Node+OBS直播服务器搭建总结
    WebRTC网页录制音视频教程
    人生有尺 做人有度
    「道 德 經」 : 第 二 十 四 章
    看山是山,看水是水;看山不是山,看水不是水;看山还是山,看水还是水。
    「道 德 经」 : 第 八 章
    Ubuntu下安装Chrome浏览器的两个方法
    chromium中增加自己的文件夹
    chromium 切换主分支的方法
    chromium 示例
  • 原文地址:https://www.cnblogs.com/zhujiangning/p/6654407.html
Copyright © 2011-2022 走看看