HDU -- 4280 Island Transport(最大流)

原创 2015年07月10日 16:46:32

题目大意:

n个岛屿,m个无向路径,问从最西边的岛屿到最东边的岛屿的最多能运送多少乘客;

代码实现:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=100010;
const int INF=0x3f3f3f3f;
int head[N],dis[N],pre[N],gap[N],cur[N],low[N],s,t,n,m,top;

struct Edge{
    int to,flow,next;
}edge[N*4];

void Addedge(int from,int to,int val){
    edge[top].to=to,edge[top].flow=val,edge[top].next=head[from],head[from]=top++;
    edge[top].to=from,edge[top].flow=0,edge[top].next=head[to],head[to]=top++;
}

void Bfs(){
    queue<int> q;
    memset(gap,0,sizeof(gap));
    memset(dis,-1,sizeof(dis));
    gap[0]=1;
    dis[t]=0;
    q.push(t);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=head[u];i+1;i=edge[i].next){
            if(dis[edge[i].to]==-1&&edge[i].flow){
                dis[edge[i].to]=dis[u]+1;
                gap[dis[edge[i].to]]++;
                q.push(edge[i].to);
            }
        }
    }
}

int Sap(){
    Bfs();
    memset(pre,-1,sizeof(pre));
    for(int i=1;i<=n;++i) cur[i]=head[i];
    int u=s,i,cur_flow,max_flow=0,neck,tmp;
    while(dis[s]<n){
        if(u==t){
            cur_flow=INF;
            for(int i=s;i!=t;i=edge[cur[i]].to){
                if(cur_flow>edge[cur[i]].flow){
                    neck=i;
                    cur_flow=edge[cur[i]].flow;
                }
            }
            for(int i=s;i!=t;i=edge[cur[i]].to){
                tmp=cur[i];
                edge[tmp].flow-=cur_flow;
                edge[tmp^1].flow+=cur_flow;
            }
            max_flow+=cur_flow;
            u=neck;
        }
        int i;
        for(i=cur[u];i!=-1;i=edge[i].next)
            if(edge[i].flow&&dis[u]==dis[edge[i].to]+1) break;
        if(i!=-1){
            cur[u]=i;
            pre[edge[i].to]=u;
            u=edge[i].to;
        }else{
            if(--gap[dis[u]]==0) break;
            cur[u]=head[u];
            int mindis=n;
            for(i=head[u];i!=-1;i=edge[i].next){
                if(edge[i].flow&&mindis>dis[edge[i].to])
                    mindis=dis[edge[i].to];
            }
            dis[u]=mindis+1;
            gap[dis[u]]++;
            if(u!=s) u=pre[u];
        }
    }
    return max_flow;
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int u,v,val,x,y;
        memset(head,-1,sizeof(head));
        top=0;
        scanf("%d%d",&n,&m);
        int ss=INF,tt=0;
        for(int i=1;i<=n;++i){
            scanf("%d%d",&x,&y);
            if(ss>x) ss=x,s=i;
            if(tt<x) tt=x,t=i;
        }
        for(int i=0;i<m;++i){
            scanf("%d%d%d",&u,&v,&val);
            Addedge(u,v,val);
            Addedge(v,u,val);
        }
        int res=0;
        res=Sap();
        printf("%d\n",res);
    }
}


版权声明:欢迎转载,转载请注明出处

相关文章推荐

hdu4280 Island Transport 最大流 ISAP模板题

Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other...

HDU 4280 Island Transport 最大流SAP

网络流,模板很重要, #include #include #include #include #include #define MAXN 100005 #define MAXE 1...

Hdu 4280 Island Transport(最大流)

Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe...

栈优化最大流-HDU-4280-Island Transport

Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe...

Island Transport HDU - 4280 最大流 ISAP

题目链接: Island Transport HDU - 4280 题目大意n个顶点, m条边(2≤n,m≤1052 \leq n, m\leq 10^5), 每条边有容量限制, 求起点到终点的最大流...

Island Transport hdu 4280 (最大流 dinic)

题目 题目意思 有n个岛屿,岛屿会与其他岛屿相连接,每小时各个岛屿 间可运输的人有限,问从最东(左)到最西(右),每小时最多可以运多少人。 题目可分辨出是最大流问题,然而却卡dinic。T了无数次...

hdu4280——Island Transport(最大流SAP算法)

Problem Description   In the vast waters far far away, there are many islands. People are living on...

HDU 4280Island Transport(网络流之最大流)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4280 这个题是一个纯最大流模板题。。就是用来卡时间的。。还好我会isap算法。。但是坑爹的是一直WA...

HDU 4280 Island Transport (网络流 sap)

裸的网络流模板题 /* 最大流模板 sap */ #include #include #include #include using namespace std; const int MA...

HDU 4280 Island Transport 网络流

Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)