`
暴风雪
  • 浏览: 389137 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[二分+最大流]zoj 3691:flower

阅读更多

大致题意:

    在一个三维空间中有n个点,每个点的坐标都是正整数。第i个点上面有fi个花朵,每个点最多能运送li朵花到其他的点上,每次只能把一个点上的花朵送到距离其R的点上。现在求出最小的R,使得所有的花朵都能被移动到第一个点上。

 

大致思路:

    二分+最大流~~好久没ac的说

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int inf=1<<28;
const int nMax=800;
const int mMax=100000;

class node{
    public:
    int c,u,v,next;
};node edge[mMax];
int ne, head[nMax];
int cur[nMax], ps[nMax], dep[nMax];

void addedge(int u, int v,int w){   ////dinic
    edge[ne].u = u;
    edge[ne].v = v;
    edge[ne].c = w;
    edge[ne].next = head[u];
    head[u] = ne ++;
    edge[ne].u = v;
    edge[ne].v = u;
    edge[ne].c = 0;
    edge[ne].next = head[v];
    head[v] = ne ++;
}

int dinic(int s, int t){                       //  dinic
    int tr, res = 0;
    int i, j, k, f, r, top;
    while(1){
        memset(dep, -1, sizeof(dep));
        for(f = dep[ps[0]=s] = 0, r = 1; f != r;)
            for(i = ps[f ++], j = head[i]; j; j = edge[j].next)
                if(edge[j].c && dep[k=edge[j].v] == -1){
                    dep[k] = dep[i] + 1;
                    ps[r ++] = k;
                    if(k == t){
                        f = r; break;
                    }
                }
        if(dep[t] == -1) break;
        memcpy(cur, head, sizeof(cur));
        i = s, top = 0;
        while(1){
            if(i == t){
                for(tr =inf, k = 0; k < top; k ++)
                    if(edge[ps[k]].c < tr)
                        tr = edge[ps[f=k]].c;
                for(k = 0; k < top; k ++){
                    edge[ps[k]].c -= tr;
                    edge[ps[k]^1].c += tr;
                }
                i = edge[ps[top=f]].u;
                res += tr;
            }
            for(j = cur[i]; cur[i]; j = cur[i] =edge[cur[i]].next){
                if(edge[j].c && dep[i]+1 == dep[edge[j].v]) break;
            }
            if(cur[i]){
                ps[top ++] = cur[i];
                i = edge[cur[i]].v;
            }
            else{
                if(top == 0) break;
                dep[i] = -1;
                i = edge[ps[-- top]].u;
            }
        }
    }
    return res;
}

//double max(double a,double b){if(a>b)return a;return b;}
int sum[nMax][5],num,n;
int dis[nMax][nMax];
void getdis(int a,int b){
    if(a==b)return;
    int res;
    res=(sum[a][0]-sum[b][0])*(sum[a][0]-sum[b][0])+(sum[a][1]-sum[b][1])*(sum[a][1]-sum[b][1])+(sum[a][2]-sum[b][2])*(sum[a][2]-sum[b][2]);
    dis[a][b]=res;
}

bool check(int mid){
    int i,j,res;
    ne=2;
    memset(head,0,sizeof(head));
    for(i=1;i<n;i++){
        addedge(0,i,sum[i][3]);
        addedge(i,i+n,sum[i][4]);
        for(j=1;j<n;j++){
            if(dis[i][j]<=mid){
                addedge(i+n,j,sum[i][3]);
            }
        }
        if(dis[i][0]<=mid)addedge(i+n,n*2+1,sum[i][4]);
    }
    res=dinic(0,2*n+1);
    if(res>=num)return 1;
    return 0;
}

int main(){
    int i,j,ans;
    while(cin>>n){
        num=0;
        for(i=0;i<n;i++){
            scanf("%d%d%d%d%d",&sum[i][0],&sum[i][1],&sum[i][2],&sum[i][3],&sum[i][4]);
            if(i!=0)num+=sum[i][3];
        }
        if(n==1){
            printf("%.7lf\n",0);
            continue;
        }
        int left=0,right,mid;
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                getdis(i,j);
                right=max(right,dis[i][j]);
            }
        }
        if(!check(right)){
            cout<<-1<<endl;
            continue;
        }
        while(right>=left){
            mid=(left+right)/2;
            if(check(mid)){
                right=mid-1;
                ans=mid;
            }
            else{
                left=mid+1;
            }
        }
        printf("%.7lf\n",sqrt(ans*1.0));
    }
    return 0;
}

 

1
8
分享到:
评论
1 楼 McFlurry 2013-05-02  
YM宇哥,宝刀未老。

相关推荐

    ZOJ:浙江大学程序在线评测系统.docx

    ZOJ,全称“浙江大学程序在线评测系统”(Zhejiang University Online Judge),是一个提供信息学(算法竞赛)题库及程序评测的网站。以下是关于ZOJ的详细介绍: 一、基本信息 名称:浙江大学程序在线评测系统(ZOJ)...

    pku hdu zoj题目分类

    "图论_网络流入门题.doc"可能包含的是图论的基本概念和网络流算法的学习材料,如最大流、最小割等,这些都是解决网络调度、资源分配等问题的关键。 4. **计算几何**: "POJ 计算几何入门题目.doc"可能介绍了计算...

    浙江大学ZOJ题目分类

    浙江大学ZOJ(Zhejiang University Online Judge)是一个在线编程练习平台,主要服务于计算机科学和技术的学习者,特别是对算法和编程有浓厚兴趣的学生。这个平台提供了大量的编程题目,涵盖了各种难度和主题,帮助...

    zoj 源码700题

    3. **算法与数据结构**:700题涵盖的范围广泛,涉及基本的排序算法(如冒泡、快速、归并排序),查找算法(如二分查找),以及高级算法如动态规划(如斐波那契数列、背包问题)、图论(如最短路径、最小生成树)、...

    zoj 1002_zoj1002_

    【标题】"ZOJ 1002" 是一个在线编程竞赛题目,源自ZOJ(Zhejiang Online Judge),这是一个面向ACM/ICPC(国际大学生程序设计竞赛)的在线评测系统。题目编号1002,通常表示该题是ZOJ平台上的一个问题,可能涉及算法...

    zoj.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar

    标签"_zoj zoj__1016 max_flow zoj__1045 zoj.rar"进一步强调了主题,特别是"max_flow"标签再次表明了这两个题目与最大流问题的关联。 至于压缩包内的"ZJU",这可能是指浙江大学(Zhejiang University)的缩写,...

    ACM训练必备POJ ZOJ题目分类及解题思路

    学习ACM程序设计的朋友一定要看,这是训练必备的POJ ZOJ题目分类及解题思路

    zoj 分类加题解(浙大ACM)

    《ZOJ ACM分类加题解》是针对浙江大学ACM竞赛训练平台的一份宝贵资源,它包含了大量的编程竞赛题目和相应的解答。这份资料旨在帮助参赛者提升算法能力,提高解决实际问题的技巧,无论是在无网络环境下还是有网络时,...

    ZOJ题解集合-截至2835

    1. **基础算法**:包括排序(如快速排序、归并排序)、搜索(如二分查找)、动态规划、贪心算法、回溯算法等。 2. **高级数据结构**:如链表、树(二叉树、平衡树如AVL和红黑树)、图(深度优先搜索、广度优先搜索...

    ZOJ1003 Crashing Balloon

    【ZOJ1003 Crashing Balloon】这个问题是一个经典的计算机科学竞赛编程题目,主要涉及动态规划(Dynamic Programming, DP)和贪心算法(Greedy Algorithm)的知识点。在这个问题中,参赛者需要编写程序来模拟气球...

    zoj1027解题指南

    【标题】"ZOJ1027解题指南"是一个针对特定编程竞赛题目——ZOJ1027的解决方案集合。ZOJ,全称为“Zhejiang Online Judge”,是浙江大学主办的一个在线编程竞赛平台,提供了丰富的算法题目供参赛者练习和挑战。本解题...

    zoj 700源代码

    ZOJ,全称为Zhejiang Online Judge,是一个知名的在线编程竞赛平台,主要服务于浙江大学和国内其他高校的学生,提供丰富的算法题目供参赛者练习和比赛。这个压缩包文件名为"ZOJ 700多题源代码",意味着它包含了解决...

    ZOJ1004回溯+深搜

    深度搜索 回溯 int main { string s1 s2; while cin &gt;&gt; s1 &gt;&gt; s2 { count 0; cout &lt;&lt; &quot;[&quot; &lt;&lt; endl; if s1 length s2 length BackTrake s1 s2 ;... [更多]

    zoj 题库 详细解答 解题代码

    zoj 题库 详细解答 解题代码 该资源主要涵盖了 zoj 题库中的各种编程题目,涵盖了基本算法、数据结构、数学运算等多个方面的知识点。下面是对该资源中出现的知识点的详细解释: 1. 第一次 ACM 总结(7th ACM) 该...

    ZOJ题目答案源码

    首先,我们可以从这些源代码中学习到基础的算法思想,如排序算法(快速排序、归并排序、冒泡排序、插入排序等)、搜索算法(二分查找、深度优先搜索、广度优先搜索等)。这些算法是解决问题的基本工具,理解和掌握...

    Problem Arrangement zoj 3777

    Problem Arrangement zoj 3777

    acm.tar.gz_zoj_zoj题解_题目分类

    9. 排序和搜索:快速排序、归并排序、二分查找等,这些都是算法中的基本操作。 难易度的划分则可能基于题目所需的时间复杂度、空间复杂度、解题思路的复杂性等因素。初级题目通常是基础概念和算法的运用,适合初学...

    zoj.rar_zoj_zoj4041

    《ZOJ 4041问题的正确解法与程序分析》 ZOJ(Zhejiang Online Judge)是一个知名的在线编程竞赛平台,其中的题目编号为4041的题目吸引了众多程序员的关注。本篇文章将深入探讨ZOJ 4041的正确解法,并对提供的源代码...

    zoj代码集合

    1. **基础算法**:作为入门部分,这个集合可能包括基础数据结构和算法,如排序(快速排序、归并排序、堆排序)、查找(二分查找、哈希表查找)以及图论的基本概念(Dijkstra、Floyd等)。这些是所有ACM竞赛者必须...

Global site tag (gtag.js) - Google Analytics