糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 2395 Out of Hay 二分+深搜

思路:

留意到题目里面有一句话“All farms are connected one way or another to Farm 1.”。
这貌似说明图一开始就是连通的。

二分答案,判断依据是:
如果将大于某个长度的边都去掉以后,图就不连通了。
那这个长度相对答案来说,一定是大了。


#include <stdio.h>

#define MAX_M 10032
#define MAX_N 2048

struct edge_node {
    
int idx, len;
    
struct edge_node *next;
}
;

struct edge_node edges[MAX_M*2], *map[MAX_N];
int N, M, vis[MAX_N], tm, stk[MAX_N], *sp;

inline 
int can(int limit)
{
    
int cnt;
    
struct edge_node *e;

    tm
++;
    sp 
= stk;
    
*sp++ = 1;
    vis[
1= tm;
    cnt 
= 0;
    
while (sp > stk) {
        sp
--;
        cnt
++;
        
for (e = map[*sp]; e; e = e->next) {
            
if (vis[e->idx] == tm || e->len > limit) 
                
continue;
            vis[e
->idx] = tm;
            
*sp++ = e->idx;
        }

    }


    
return cnt == N;
}


inline 
void insert(struct edge_node *e, int a, int b, int len)
{
    e
->idx = b;
    e
->len = len;
    e
->next = map[a];
    map[a] 
= e;
}


int main()
{
    
int l, r, m, i, a, b, len;

    scanf(
"%d%d"&N, &M);
    l 
= 0x7fffffff;
    r 
= 0;
    
for (i = 0; i < M*2; i += 2{
        scanf(
"%d%d%d"&a, &b, &len);
        insert(
&edges[i], a, b, len);
        insert(
&edges[i + 1], b, a, len);
        
if (len < l)
            l 
= len;
        
if (len > r)
            r 
= len;
    }


    
while (l <= r) {
        m 
= (l + r) / 2;
        
if (!can(m))
            l 
= m + 1;
        
else
            r 
= m - 1;
    }

    printf(
"%d\n", r + 1);

    
return 0;
}


posted on 2010-04-06 23:33 糯米 阅读(253) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理