HDU 4280 Island Transport (网络流)

来源:互联网 发布:unity3d 离线下载 编辑:程序博客网 时间:2024/05/19 23:53

题目大意:给定n个点的坐标,m个的点之间关系,即游客从i到j之间的流量。问从最西边到最东边能够运输的客人流量的最大值(/每小时)。

思路:直接见图找到源汇点跑最大流。

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <queue>#define inf 0x3f3f3f3fusing namespace std;struct nod{    int x,y;}qq[100100];struct node{    int to,next;    int w;}q[100100*4];int head[100100],cnt;bool vis[100100];int st,ed;void add(int a,int b,int c){    q[cnt].to = b;    q[cnt].w = c;    q[cnt].next=head[a];    head[a] = cnt++;    q[cnt].to = a;    q[cnt].w = c;    q[cnt].next=head[b];    head[b] = cnt++;}int l[100100];bool bfs(){    memset(l,-1,sizeof(l) );    l[st]=0;    queue<int>Q;    Q.push(st);    while(!Q.empty()){        int u=Q.front();        Q.pop();        for(int i = head[u]; ~i ;i=q[i].next){            int v=q[i].to;            if(q[i].w > 0&&l[v]==-1){                l[v] = l[u] + 1;                Q.push(v);            }        }    }    return l[ed]!=-1;}int dfs(int x,int f){    if(x == ed || !f){        return f;    }    int a,tmp=0;    for(int i=head[x] ;~i; i=q[i].next){        int v = q[i].to;        if(q[i].w > 0 && l[x]+1==l[v]){            a = dfs(v,min(q[i].w,f-tmp));            if(a > 0){                q[i].w -= a;                q[i^1].w += a;                tmp += a;                if(tmp ==f )                    break;            }        }    }    if(!tmp)        l[x] =-1;    return tmp;}int main(){    int n,m,i,j,k,cla;    scanf("%d",&cla);    while(cla--){        scanf("%d%d",&n,&m);        memset(head,-1,sizeof(head));        memset(vis,false,sizeof(vis));        int l=inf,r=-inf;        cnt=0;        for(i = 1;i <= n;++ i ){            scanf("%d%d",&qq[i].x,&qq[i].y);            if(l > qq[i].x){                st = i;                l = qq[i].x;            }            else if( l == qq[i].x){                if(qq[l].y > qq[i].y){                    l=i;                }            }            if(r < qq[i].x ){                ed = i;                r = qq[i].x;            }            else if(r == qq[i].x){                if(qq[r].y < qq[i].y)                    ed = i;            }        }        //cout<<st<<" "<<ed<<endl;        int a,b,c;        for(i = 0;i < m;++ i){            scanf("%d%d%d",&a,&b,&c);            add(a,b,c);        }        int ans=0;        while(bfs()){            ans+= dfs(st,inf);        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击