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 living
on the islands, and all the transport among the islands relies on the
ships.
  You have a transportation company there. Some routes are
opened for passengers. Each route is a straight line connecting two
different islands, and it is bidirectional. Within an hour, a route can
transport a certain number of passengers in one direction. For safety,
no two routes are cross or overlap and no routes will pass an island
except the departing island and the arriving island. Each island can be
treated as a point on the XY plane coordinate system. X coordinate
increase from west to east, and Y coordinate increase from south to
north.
  The transport capacity is important to you. Suppose many
passengers depart from the westernmost island and would like to arrive
at the easternmost island, the maximum number of passengers arrive at
the latter within every hour is the transport capacity. Please calculate
it.

Input

  The first line contains one integer T (1<=T<=20), the number of test cases.
  Then
T test cases follow. The first line of each test case contains two
integers N and M (2<=N,M<=100000), the number of islands and the
number of routes. Islands are number from 1 to N.
  Then N lines
follow. Each line contain two integers, the X and Y coordinate of an
island. The K-th line in the N lines describes the island K. The
absolute values of all the coordinates are no more than 100000.
  Then
M lines follow. Each line contains three integers I1, I2
(1<=I1,I2<=N) and C (1<=C<=10000) . It means there is a
route connecting island I1 and island I2, and it can transport C
passengers in one direction within an hour.
  It is guaranteed that
the routes obey the rules described above. There is only one island is
westernmost and only one island is easternmost. No two islands would
have the same coordinates. Each island can go to any other island by the
routes.

Output

  For each test case, output an integer in one line, the transport capacity.

Sample Input

2
5 7
3 3
3 0
3 1
0 0
4 5
1 3 3
2 3 4
2 4 3
1 5 6
4 5 3
1 4 4
3 4 2
6 7
-1 -1
0 1
0 2
1 0
1 1
2 3
1 2 1
2 3 6
4 5 5
5 6 3
1 4 6
2 5 5
3 6 4

Sample Output

9

6

分析:比较裸的最大流,先找起点(X坐标最小)和终点(X坐标最大),

用数组模拟邻接链表记录图的边,跑一遍Dinic算出最大流。

用G++提交8330MS,用C++提交Time Limit Exceeded......

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define INF 1000000007
using namespace std;
int N,M,cnt,T,S;//T是终点
struct Node{
    int t,c;
}edge[500000];
int head[100010],next1[500000];
int dis[100010];

void add(int s,int t,int c)
{
    edge[cnt].t=t;
    edge[cnt].c=c;
    next1[cnt]=head[s];
    head[s]=cnt++;
}

int bfs()
{
    memset(dis,-1,sizeof(dis));
    dis[S]=0;
    queue<int> q;
    q.push(S);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        int k=head[u];
        while(k!=-1)
        {
            int v=edge[k].t;
            if(dis[v]==-1&&edge[k].c>0)
            {
                dis[v]=dis[u]+1;
                q.push(v);
            }
            k=next1[k];
        }
    }
    if(dis[T]>0) return 1;
    return 0;
}

int dfs(int cur,int m)
{
    if(cur==T) return m;
    int res=0,f,k=head[cur];
    while(k!=-1)
    {
        if(dis[edge[k].t]==dis[cur]+1&&edge[k].c>0&&(f=dfs(edge[k].t,min(m,edge[k].c))))
        {
            edge[k].c-=f;
            edge[k^1].c+=f;
            res+=f;
            m-=f;
            if(!m) break;
        }
        k=next1[k];
    }
    if(!res) dis[cur]=-2;
    return res;
}

int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        memset(head,-1,sizeof(head));
        scanf("%d%d",&N,&M);
        int sx=INF,tx=-INF;//起点S和终点T的x坐标
        cnt=S=T=0;
        for(int i=1;i<=N;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            if(sx>=x) {sx=x;S=i;}
            if(tx<=x) {tx=x;T=i;}
        }
        for(int i=0;i<M;i++)
        {
            int s,t,c;
            scanf("%d%d%d",&s,&t,&c);
            add(s,t,c);
            add(t,s,c);
        }
        int ans=0,res;
        while(bfs())
            while(res=dfs(S,INF)) ans+=res;
        printf("%d\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/ACRykl/p/8859076.html

时间: 2024-10-08 19:02:12

hdu4280 Island Transport(最大流Dinic数组模拟邻接连边)的相关文章

HDU4280 Island Transport【最大流】【SAP】

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

SDUT OJ 图练习-BFS-从起点到目标点的最短步数 (vector二维数组模拟邻接表+bfs , *【模板】 )

图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 在古老的魔兽传说中,有两个军团,一个叫天灾,一个叫近卫.在他们所在的地域,有n个隘口,编号为1..n,某些隘口之间是有通道连接的.其中近卫军团在1号隘口,天灾军团在n号隘口.某一天,天灾军团的领袖巫妖王决定派兵攻打近卫军团,天灾军团的部队如此庞大,甚至可以填江过河.但是巫妖王不想付出不必要的代价,他想知道在不修建任何通道的前提下,部队是否

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

Hdu 4280 Island Transport(最大流)

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

Island Transport

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

最大流 Dinic + Sap 模板

不说别的,直接上模板. Dinic+当前弧优化: struct Edge{ int x,y,c,ne; }e[M*2]; int be[N],all; int d[N],q[N]; int stack[N],top;//栈存的是边 int cur[N];//当前弧优化 void add(int x, int y, int z)//需保证相反边第一个为偶数 { e[all].x=x; e[all].y=y; e[all].c=z; e[all].ne=be[x]; be[x]=all++; e[a

【算法】网络最大流 Dinic

Dinic的大体思路是和EK差不多的(其实很多算法的大体思路都一样),只不过Dinic在每次寻找增广路时先bfs一下,给每个点都加上一个等级,而规定:只有等级相邻的两个点之间才能走,那么在dfs时就会减掉很多无用因此不必要的道路 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<queue> 6 using na

POJ训练计划1459_Power Network(网络流最大流/Dinic)

解题报告 这题建模实在是好建,,,好贱,,, 给前向星给跪了,纯dinic的前向星竟然TLE,sad,,,回头看看优化,,, 矩阵跑过了,2A,sad,,, /************************************************************************* > File Name: PowerN.cpp > Author: _nplus > Mail: [email protected] > Time: 2014年07月19日 星期

网络最大流 dinic算法

一句话题意:给出一个网络图,以及其源点和汇点,求出其网络最大流 //dinic算法; //时间复杂度O(V^2E); #include<bits/stdc++.h> #define inf 999999 #define maxn 200000 using namespace std; int n,m,s,t; int ans=0; struct Edge { int to,next,w; }; struct Edge edge[maxn]; int head[maxn],val[maxn],p