专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Go

poj 3228 Gold Transportation 2分+最大流

发布时间:2011-06-29 18:27:49 文章来源:www.iduyao.cn 采编人员:星星草
poj 3228 Gold Transportation 二分+最大流

http://poj.org/problem?id=3228

题意:有n个城市,每个城市有一定量的金子,我们需要把所有的金子都存到城市中的仓库中,有一些道路连通这些城市,每条道路都有自己的花费,要求的是,把所有的金子都运到仓库中,所走的那些道路,其中花费的最大值最小是多少。

思路,二分答案,把花费比答案小的那些道路建成一个图,再建立一个源点和所有城市相连,流量是每个城市的金子数量,再建立一个汇点,连接所有的城市,流量是每个城市金子的最大存储量。再跑一遍最大流,如果流量等于所有的金子和,那么就可以,否则就不可以。


#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;


const int inf=1e9;
struct Side{
    int from,to,val;
}side1[20010];
struct Side2{
    int to,val,next;
}side2[40010];
int n,m;
int a[210],b[210];
int cnt,dis[210],gap[210];
int node[210],top;
int sum;


void addside(int a,int b,int c){
    side2[top]=(Side2){b,c,node[a]};
    node[a]=top++;
    side2[top]=(Side2){a,0,node[b]};
    node[b]=top++;
}


int getflow(int u,int f){
    if(u==n+1)
        return f;
    int ans=0;
    for(int i=node[u];i!=-1;i=side2[i].next){
        int to=side2[i].to,c=side2[i].val;
        if(dis[u]>dis[to]&&c){
            int x=getflow(to,min(f-ans,c));
            side2[i].val-=x;
            side2[i^1].val+=x;
            ans+=x;
            if(ans==f)  return ans;
        }
    }
    gap[dis[u]]--;
    if(gap[dis[u]]==0) dis[0]=cnt+2;
    dis[u]++;
    gap[dis[u]]++;
    return ans;
}


bool ok(int x){
    cnt=n+2;
    memset(dis,0,sizeof(dis));
    memset(gap,0,sizeof(gap));
    memset(node,-1,sizeof(node));
    gap[0]=cnt;
    top=0;
    for(int i=1;i<=n;i++){
        addside(0,i,a[i]);
        addside(i,n+1,b[i]);
    }
    for(int i=0;i<m;i++) if(side1[i].val<=x){
        addside(side1[i].from,side1[i].to,inf);
        addside(side1[i].to,side1[i].from,inf);
    }
    int ans=0;
    while(dis[0]<cnt) ans+=getflow(0,inf);
    if(ans==sum)
        return 1;
    else  return 0;
}




int main()
{    
    while(cin>>n){
        sum=0;
        if(n==0) break;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        for(int i=1;i<=n;i++)
            scanf("%d",&b[i]);
        cin>>m;
        int x,y,z;
        int l=1e9,r=0,mid;
        for(int i=0;i<m;i++){
            scanf("%d %d %d",&x,&y,&z);
            side1[i]=(Side){x,y,z};
            l=min(l,z);
            r=max(r,z);
        }
        r++;
        int maxx=r;
        while(l!=r){
            mid=(l+r)/2;
            if(ok(mid))
                r=mid;
            else l=mid+1;
        }
        if(l==maxx)
            cout<<"No Solution"<<endl;
        else cout<<l<<endl;
    }
    return 0;
}


友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ModernUI课程:定义一个Logo

    ModernUI教程:定义一个Logo ModernWindow的标题栏包含了一块区域用来显示自定义的窗体Logo: 这个窗体logo通过ModernWindow.LogoD...

  • Django忘记管理员账号和密码的解决方法

    Django忘记管理员账号和密码的解决办法 看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了。结果搭建成功以后,一直...

  • GO语言小结(1)——基本知识

    GO语言总结(1)——基本知识 1、注释(与C++一样)   行注释://  块注释:/*   ...  */ 2、标识符   可以这么说,除了数字开头...

  • golang 惯用的文件读取方式

    golang 常用的文件读取方式 Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。 一次性读取 小文件推荐一...

  • 查询深圳市通相关信息

    查询深圳通相关信息 用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。 注意:获取的并不是实...

  • Go语言设计模式实践:结合(Composite)

    Go语言设计模式实践:组合(Composite) 关于本系列 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就...

  • 列出索引和遍历目录

    列出目录和遍历目录 获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法请参考文章示例。 示例代码: package ma...

  • io 包的惯用接口速记

    io 包的常用接口速记 我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在...

  • 代理服务扩充

    代理服务扩展 之前自己实现了一个代理服务,当时考虑的是只要支持SOCKS5就好了,因为我经常用CHROME,配合着SwitchySharp,体验还是很棒...

  • 文件的创造与打开

    文件的创建与打开 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package ...

热门推荐: