hdu4280(最大流)

传送门:Island Transport

题意:有N个岛屿 M条无向路 每个路有一最大允许的客流量,求从最西的那个岛屿最多能运用多少乘客到最东的那个岛屿。

分析:无向图正反都加弧,权值一样,这题点多,使用SAP优势大,点少时dinic好些。

dinic:8314ms

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <limits.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 100010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
inline int read()
{
    char ch=getchar();
    int x=0,f=1;
    while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch<=‘9‘&&ch>=‘0‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int n,m,vs,vt,tot;
int pre[N],q[N],cur[N],h[N];
struct edge
{
    int v,w,next;
    edge(){}
    edge(int v,int w,int next):v(v),w(w),next(next){}
}e[N<<1];
void addedge(int u,int v,int w)
{
    e[tot]=edge(v,w,pre[u]);
    pre[u]=tot++;
    e[tot]=edge(u,w,pre[v]);
    pre[v]=tot++;
}
void init()
{
    memset(pre,-1,sizeof(pre));
    tot=0;
}
/*******************dinic************************/
int bfs()
{
    int head=0,tail=1;
    memset(h,-1,sizeof(h));
    q[0]=vs;h[vs]=0;
    while(head!=tail)
    {
        int u=q[head++];
        for(int i=pre[u];~i;i=e[i].next)
        {
            int v=e[i].v,w=e[i].w;
            if(w&&h[v]==-1)
            {
                h[v]=h[u]+1;
                q[tail++]=v;
            }
        }
    }
    return h[vt]!=-1;
}
int dfs(int u,int flow)
{
    if(u==vt)return flow;
    int used=0;
    for(int i=cur[u];~i;i=e[i].next)
    {
        int v=e[i].v,w=e[i].w;
        if(h[v]==h[u]+1)
        {
            w=dfs(v,min(flow-used,w));
            e[i].w-=w;e[i^1].w+=w;
            if(e[i].w)cur[u]=i;
            used+=w;
            if(used==flow)return flow;
        }
    }
    if(!used)h[u]=-1;
    return used;
}
int dinic()
{
    int res=0;
    while(bfs())
    {
        for(int i=1;i<=n;i++)cur[i]=pre[i];
        res+=dfs(vs,inf);
    }
    return res;
}
/********************dinic***********************/
void build()
{
    int u,v,w;
    int mx=-inf,mn=inf;
    n=read();m=read();
    for(int i=1;i<=n;i++)
    {
        u=read();v=read();
        if(u<mn)mn=u,vs=i;
        if(u>mx)mx=u,vt=i;
    }
    for(int i=1;i<=m;i++)
    {
        u=read();v=read();w=read();
        addedge(u,v,w);
    }
}
int main()
{
    int T;
    T=read();
    while(T--)
    {
        init();
        build();
        printf("%d\n",dinic());
    }
}

SAP:2917ms

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <limits.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 100010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
inline int read()
{
    char ch=getchar();
    int x=0,f=1;
    while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch<=‘9‘&&ch>=‘0‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int n,m,vs,vt,tot,NV;
int head[N],gap[N],level[N],q[N];
struct edge
{
    int v,w,next;
    edge(){}
    edge(int v,int w,int next):v(v),w(w),next(next){}
}e[N<<1];
void addedge(int u,int v,int w)
{
    e[tot]=edge(v,w,head[u]);
    head[u]=tot++;
    e[tot]=edge(u,w,head[v]);
    head[v]=tot++;
}
void init()
{
    memset(head,-1,sizeof(head));
    tot=0;
}
/***************************SAP***********************/
void bfs(int vt)
{
    memset(level,-1,sizeof(level));
    memset(gap,0,sizeof(gap));
    level[vt]=0;
    gap[level[vt]]++;
    queue<int>que;
    que.push(vt);
    while(!que.empty()) {
        int u=que.front();
        que.pop();
        for(int i=head[u]; i!=-1; i=e[i].next) {
            int v=e[i].v;
            if(level[v]!=-1)continue;
            level[v]=level[u]+1;
            gap[level[v]]++;
            que.push(v);

        }
    }
}
int pre[N];
int cur[N];
int SAP()
{
    bfs(vt);
    memset(pre,-1,sizeof(pre));
    memcpy(cur,head,sizeof(head));
    int u=pre[vs]=vs,flow=0,aug=inf;
    gap[0]=NV;
    while(level[vs]<NV) {
        bool flag=false;
        for(int &i=cur[u]; i!=-1; i=e[i].next) {
            int v=e[i].v;
            if(e[i].w&&level[u]==level[v]+1) {
                flag=true;
                pre[v]=u;
                u=v;
                aug=min(aug,e[i].w);
                if(v==vt) {
                    flow+=aug;
                    for(u=pre[v]; v!=vs; v=u,u=pre[u]) {
                        e[cur[u]].w-=aug;
                        e[cur[u]^1].w+=aug;
                    }
                    aug=inf;
                }
                break;
            }
        }
        if(flag)continue;
        int minlevel=NV;
        for(int i=head[u]; i!=-1; i=e[i].next) {
            int v=e[i].v;
            if(e[i].w&&level[v]<minlevel) {
                minlevel=level[v];
                cur[u]=i;
            }
        }
        if(--gap[level[u]]==0)break;
        level[u]=minlevel+1;
        gap[level[u]]++;
        u=pre[u];
    }
    return flow;
}
/**************************SAP**********************/
void build()
{
    int u,v,w;
    int mx=-inf,mn=inf;
    n=read();m=read();
    NV=n+1;
    for(int i=1;i<=n;i++)
    {
        u=read();v=read();
        if(u<mn)mn=u,vs=i;
        if(u>mx)mx=u,vt=i;
    }
    for(int i=1;i<=m;i++)
    {
        u=read();v=read();w=read();
        addedge(u,v,w);
    }
}
int main()
{
    int T;
    T=read();
    while(T--)
    {
        init();
        build();
        printf("%d\n",SAP());
    }
}

时间: 2024-11-04 12:51:02

hdu4280(最大流)的相关文章

HDU4280 Island Transport【最大流】【SAP】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4280 题目大意: 有N个岛屿,M条双向道路.每条路每小时最多能通过Ci个人.给你N个岛屿的坐标.问:一个小时内, 最多能将多少游客从最西边的岛送至最东边的岛屿上. 思路: 网络流求最大流的裸题.先通过坐标找到最西边的岛屿和最东边的岛屿,记录并标记为源点和汇点.然后 用链式前向星来存储图,将M条双向边加入到图中.然后用SAP算法来做,据说还没有卡SAP的网络流. 算法用了GAP优化.当前弧优化,具体

hdu4280 Island Transport(最大流Dinic数组模拟邻接连边)

Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 10716    Accepted Submission(s): 3430 Problem Description In the vast waters far far away, there are many islands. People are l

HDU4280:Island Transport(最大流)

Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 13187    Accepted Submission(s): 4156 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280 Description: In the vast waters far f

HDU4280(KB11-G 最大流)

Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 9151    Accepted Submission(s): 2958 Problem Description In the vast waters far far away, there are many islands. People are li

对IO流的操作(文件大小,拷贝,移动,删除)

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.SequenceInputStream; class LjyFileClass { /*LjyFileClass工具类使用需知: * * 1.计算

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

Java学习之IO流三

1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中(高效流) 1 /** 2 * 1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 3 * @author vanguard 4 * 5 */ 6 public class Demo01 { 7 public static void main(String[] args) { 8 //键盘输入两个文件夹路径 9 Scanner sc = new Scanner(System.in); 1

标准文档流

标准流指的是在不使用其他的与排列和定位相关的特殊CSS规则时,各种元素的排列规则.HTML文档中的元素可以分为两大类:行内元素和块级元素.       1.行内元素不占据单独的空间,依附于块级元素,行内元素没有自己的区域.它同样是DOM树中的一个节点,在这一点上行内元素和块级元素是没有区别的.       2.块级元素总是以块的形式表现出来,并且跟同级的兄弟块依次竖直排列,左右自动伸展,直到包含它的元素的边界,在水平方向不能并排.盒子在标准流中的定位原则margin控制的是盒子与盒子之间的距离,

Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类

一.Properties 类(java.util)     概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,properties集合的key和value都是固定的数据类型(String),该集合提供了一些特有的方法存取值,是唯一一个可以与IO流相结合的集合; 定义:public class Properties extends Hashtable