zoukankan      html  css  js  c++  java
  • uva11865 二分+最小树形图(朱刘算法)

      1 /*uva11865 二分+最小树形图(朱刘算法)
      2 注意二分的写法,树形图可作为模板,ps:杭电的模板有问题
      3 */
      4 #include<iostream>
      5 #include<string.h>
      6 #include<stdio.h>
      7 #include<stdlib.h>
      8 #include<cmath>
      9 #include<algorithm>
     10 #include<queue>
     11 #include<stack>
     12 #include<set>
     13 #include<map>
     14 #define typec int
     15 #define maxn 100+5
     16 #define maxe 10000+5
     17 using namespace std;
     18 
     19 const typec inf=0x3f3f3f3f;
     20 int nextint(){int x;scanf("%d",&x);return x;}
     21 struct Edge{
     22     int u,v;
     23     int b;
     24     typec c;//权值
     25 }edges[maxe],edge[maxe];
     26 
     27 int vis[maxn],pre[maxn],id[maxn],in[maxn],cost;
     28 int zhuliu(int root,int nv,int ne){//最小树形图
     29       int i,j,u,v;
     30       int ans=0;
     31       while(1){
     32               for(i=0;i<nv;i++)in[i]=inf;
     33               for(i=0;i<ne;i++){
     34                       u=edge[i].u;
     35                       v=edge[i].v;
     36                       if(u!=v&&edge[i].c<in[v]){
     37                               pre[v]=u;
     38                               in[v]=edge[i].c;
     39                       }
     40               }
     41               in[root]=0;
     42               for(i=0;i<nv;i++)if(in[i]==inf)return -1;
     43               int cnt=0;
     44               memset(id,-1,sizeof(id));
     45               memset(vis,-1,sizeof(vis));
     46               for(i=0;i<nv;i++){
     47                       v=i;
     48                       ans+=in[i];
     49                       while(vis[v]!=i&&id[v]==-1&&v!=root){
     50                               vis[v]=i;
     51                               v=pre[v];
     52                       }
     53                       if(v!=root&&id[v]==-1){
     54                               for(u=pre[v];u!=v;u=pre[u])id[u]=cnt;
     55                               id[v]=cnt++;
     56                       }
     57               }
     58               if(cnt==0)break;
     59               for(i=0;i<nv;i++)if(id[i]==-1)id[i]=cnt++;
     60               for(i=0;i<ne;i++){
     61                       v=edge[i].v;
     62                       edge[i].u=id[edge[i].u];
     63                       edge[i].v=id[edge[i].v];
     64                       if(edge[i].u!=edge[i].v)edge[i].c-=in[v];
     65               }
     66               nv=cnt;root=id[root];
     67       }
     68         return ans;
     69 }
     70 int T,Cost,n,m;
     71 int cnt;
     72 void built_tree(int M){
     73     cnt=0;
     74     for(int i=0;i<m;i++)
     75     if (edges[i].b>=M) edge[cnt++]=edges[i];
     76 }
     77 int main(){
     78 //    freopen("out.txt","w",stdout);
     79     cin>>T;
     80     while(cin>>n>>m>>Cost){
     81         int L=0,R=0;
     82         for(int i=0;i<m;i++) {
     83             int u,v,b,c;
     84             u=nextint();v=nextint();b=nextint();c=nextint();
     85             edges[i]=(Edge){u,v,b,c};
     86             R=max(R,edges[i].b);
     87         }
     88         bool ok=false;int ans=0;
     89         while(L<R){
     90             int M=(L+R+1)/2;
     91             built_tree(M);
     92             int mc=zhuliu(0,n,cnt);
     93             if (mc>0 && mc<=Cost) {
     94                 ok=true;
     95                 ans=L=M;
     96             }else R=M-1;
     97         }
     98         if (ok) printf("%d kbps
    ",ans);else printf("streaming not possible.
    ");
     99 
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    【Azure】创建4层SLB运行网站
    【Azure】高可用方案
    【Azure】 微软云资源管理模式(Azure Resource Manager)
    JavaScript BOM
    JavaScript数组的属性和方法
    JavaScript parseFloat() 函数和parseInt()函数
    Javascript实现checkbox的全选
    设计一个含有一个表单的页面,并且在表单上放入一个文本框。编写程序,当鼠标在页面上移动时,鼠标的坐标将显示在这个文本框中。
    如何在页面完全加载后执行JS
    如何让脚本的执行顺序按照你设定的顺序执行
  • 原文地址:https://www.cnblogs.com/little-w/p/3597019.html
Copyright © 2011-2022 走看看