国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Hdu4280 Island Transport

2019-11-08 20:18:21
字體:
供稿:網(wǎng)友

Island Transport

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
25 73 33 03 10 04 51 3 32 3 42 4 31 5 64 5 31 4 43 4 26 7-1 -10 10 21 01 12 31 2 12 3 64 5 55 6 31 4 62 5 53 6 4 Sample Output
96 ————————————————————————————————————題目的意思是給你n個(gè)點(diǎn)的坐標(biāo)和m條帶流量的無向邊求醉西邊島到最東邊島的最大流量思路:直接找出最西邊的島和最東邊的島作為源點(diǎn)和匯點(diǎn),套最大流板子即可
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <queue>#include <vector>#include <stack>#include <set>#include <map>using namespace std;const int MAXN =100010;//點(diǎn)maxconst int MAXM=400010;//邊maxconst int INF=0x3f3f3f3f;struct Edge{int to,next,cap,flow;}edge[MAXM];int tol;int head[MAXN];int gap[MAXN],dep[MAXN],cur[MAXN];void init(){    tol=0;    memset(head,-1,sizeof(head));}void addedge(int u,int v,int w,int rw=0){    edge[tol].to=v;edge[tol].cap=w;edge[tol].flow=0;    edge[tol].next=head[u];head[u]=tol++;     edge[tol].to=u;edge[tol].cap=w;edge[tol].flow=0;    edge[tol].next=head[v];head[v]=tol++;}int Q[MAXN];void BFS(int start,int end){    memset(dep,-1,sizeof(dep));    memset(gap,0,sizeof(gap));    gap[0]=1;    int front=0,rear=0;    dep[end]=0;    Q[rear++]=end;    while(front!=rear)    {        int u=Q[front++];        for(int i=head[u];i!=-1;i=edge[i].next)        {            int v=edge[i].to;            if(dep[v]!=-1)                continue;            Q[rear++]=v;            dep[v]=dep[u]+1;            gap[dep[v]]++;        }    }}int S[MAXN];int sap(int start,int end,int N){    BFS(start,end);    memcpy(cur,head,sizeof(head));    int top=0;    int u =start;    int ans=0;    while(dep[start]<N)    {        if(u==end)        {            int Min=INF;            int inser;            for(int i=0;i<top;i++)            {                if(Min>edge[S[i]].cap-edge[S[i]].flow)                {                    Min=edge[S[i]].cap-edge[S[i]].flow;                    inser=i;                }            }            for(int i=0;i<top;i++)            {                edge[S[i]].flow+=Min;                edge[S[i]^1].flow-=Min;            }            ans+=Min;            top=inser;            u=edge[S[top]^1].to;            continue;        }        bool flag=false;        int v;        for(int i=cur[u];i!=-1;i=edge[i].next)        {            v=edge[i].to;            if(edge[i].cap-edge[i].flow&&dep[v]+1==dep[u])            {                flag=true;                cur[u]=i;                break;            }        }        if(flag)        {            S[top++]=cur[u];            u=v;            continue;        }        int Min=N;        for(int i=head[u];i!=-1;i=edge[i].next)        {            if(edge[i].cap-edge[i].flow&&dep[edge[i].to]<Min)            {                Min=dep[edge[i].to];                cur[u]=i;            }        }        gap[dep[u]]--;        if(!gap[dep[u]])return ans;        dep[u]=Min+1;        gap[dep[u]]++;        if(u!=start)            u=edge[S[--top]^1].to;    }    return ans;}int main(){   int n,m,u,v,w,c;   int T;  while(~scanf("%d",&T))  {      while(T--)      {          init();          scanf("%d%d",&n,&m);          int w=999999,e=-999999,st,ed;          for(int i=1;i<=n;i++)          {              scanf("%d%d",&u,&v);              if(w>u)              {                   w=u;                   st=i;              }              if(u>e)               {                   e=u;                   ed=i;               }          }          for(int i=0;i<m;i++)          {              scanf("%d%d%d",&u,&v,&c);              addedge(u,v,c,0);          }          printf("%d/n",sap(st,ed,n));      }  }    return 0;}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁陕县| 镇康县| 濮阳县| 苏尼特右旗| 牙克石市| 北辰区| 连城县| 西和县| 孝昌县| 剑川县| 静乐县| 泊头市| 故城县| 资中县| 通城县| 碌曲县| 镇巴县| 瑞金市| 巴东县| 邮箱| 宁乡县| 应用必备| 修水县| 岗巴县| 山丹县| 盱眙县| 湘阴县| 枣庄市| 周宁县| 朔州市| 渝北区| 安庆市| 射阳县| 红原县| 贡觉县| 江孜县| 江安县| 贡觉县| 广水市| 讷河市| 敦化市|