您的位置:首页 > 其它

uva 11865 stream my contest

2013-12-14 20:03 387 查看
这明显是一个求最小树形图的题 , 只不过这个题多了一个限制条件 。

因此问题可转化为:把每条网线的话费做为每条边的权值 , 而对于最小宽带最大化 , 可以用二分法来做 。

让确定宽带是多少时 , 就禁用比这个宽带小的网线 , 然后再用朱刘算法来求最小花费 , 如果这个花费大于题目给出的限制那么就失败 ,
否则成功 。

代码:

#include

#include

#include

#include

#include

#include

using namespace std;

const int MAXN = 300;

const int inf = 0x3f3f3f3f ;

struct node

{

    int from ,
to , b , c;

    node(int
from , int to , int b , int c)

    {

   
   
this->from = from ;

   
    this->to
= to;

   
    this->b =
b;

   
    this->c=
c;

    }

};

vectorgrap , grap1;

int pre[MAXN] , min_cost[MAXN];

int cost , n , m , root ;

void init()

{

   
grap1.clear();

    memset(pre ,
0 , sizeof(pre));

    root =
0;

}

bool solve(int maxb)

{

    long long
ret = 0;

    int i;

   
grap.clear();

    for(i = 0 ;
i < grap1.size(); i++)

   
   
if(grap1[i].b >= maxb)

   
   
   
grap.push_back(grap1[i]);

   
while(1)

    {

   
    for(i = 0 ;
i < n; i++)  min_cost[i] = inf;

   
    for(i = 0 ;
i < grap.size() ; i++)

   
    {

   
   
    int u =
grap[i].from , v = grap[i].to ;

   
   
    if(grap[i].c
< min_cost[v] && u != v)

   
   
    {

   
   
   
    pre[v] =
u;

   
   
   
    min_cost[v]
= grap[i].c;

   
   
    }

   
    }

   
    for(i = 0; i
< n; i++)

   
   
   
if(min_cost[i] == inf && i != root) 
return false;

   
    int cntnode
= 0 , vis[MAXN] , done[MAXN];

   
    memset(vis ,
-1 , sizeof(vis));

   
    memset(done
, -1 , sizeof(done));

   
   
min_cost[root] = 0;

   
    for(i = 0 ;
i < n; i++)

   
    {

   
   
    ret +=
min_cost[i];

   
   
    int v =
i;

   
   
    while(vis[v]
!= i && done[v] == -1 && v != root)

   
   
    {

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: