HDU3549(最大流入门模板题)

来源:互联网 发布:中国联合网络通信官网 编辑:程序博客网 时间:2024/05/08 06:04

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549

过山车

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9322    Accepted Submission(s): 4108


Problem Description
RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
 

Input
输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
 

Output
对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。
 

Sample Input
6 3 31 11 21 32 12 33 10
 

Sample Output
3
 

Author
PrincessSnow
 

Source
RPG专场练习赛
 

Recommend
lcy   |   We have carefully selected several similar problems for you:  1068 1083 2444 1281 1150 
 

最近在看图论方面的东西(主要是以前基本没接触。。。实在太渣了。。。)  一道模板题,不解释


普通的

//最大流普通算法#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;const int MAX=1010;const int INF=1<<30;struct edge{int to,cap,rev;};vector<edge> G[MAX];bool used[MAX];void add(int from,int to,int cap){    G[from].push_back((edge){to,cap,G[to].size()});    G[to].push_back((edge){from,0,G[from].size()-1});}int dfs(int v,int t,int f){    if(v==t) return f;    used[v]=true;    for(int i=0;i<G[v].size();i++)    {        edge &e=G[v][i];        if(!used[e.to]&&e.cap>0)        {            int d=dfs(e.to,t,min(f,e.cap));            if(d>0)            {                e.cap-=d;                G[e.to][e.rev].cap+=d;                return d;            }        }    }    return 0;}int max_flow(int s,int t){    int flow=0;    for(;;)    {        memset(used,0,sizeof(used));        int f=dfs(s,t,INF);        if(f==0) return flow;        flow+=f;    }}int main(){    int T;    while(cin>>T)    {        for(int kase=1;kase<=T;kase++)        {            for(int i=0;i<MAX;i++)                G[i].clear();            int n,m;            cin>>n>>m;            for(int i=0;i<m;i++)            {                int x,y,z;                scanf("%d%d%d",&x,&y,&z);                add(x,y,z);            }            cout<<"Case "<<kase<<": "<<max_flow(1,n)<<endl;        }    }    return 0;}

才用bfs进行优化的(虽然这题明显没有必要):

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;const int MAX=1010;const int INF=1<<30;struct edge{int to,cap,rev;};vector<edge> G[MAX];int level[MAX];int iter[MAX];void add(int from,int to,int cap){    G[from].push_back((edge){to,cap,G[to].size()});    G[to].push_back((edge){from,0,G[from].size()-1});}void bfs(int s){    memset(level,-1,sizeof(level));    queue<int> que;    level[s]=0;    que.push(s);    while(!que.empty())    {        int v=que.front();        que.pop();        for(int i=0;i<G[v].size();i++)        {            edge &e=G[v][i];            if(e.cap>0&& level[e.to]<0)            {                level[e.to]=level[v]+1;                que.push(e.to);            }        }    }}int dfs(int v,int t,int f){    if(v==t) return f;    for(int &i=iter[v];i<G[v].size();i++)    {        edge &e=G[v][i];        if(e.cap>0&&level[v]<level[e.to])        {            int d=dfs(e.to,t,min(f,e.cap));            if(d>0)            {                e.cap-=d;                G[e.to][e.rev].cap+=d;                return d;            }        }    }    return 0;}int max_flow(int s,int t){    int flow=0;    for(;;)    {        bfs(s);        if(level[t]<0) return flow;        memset(iter,0,sizeof(iter));        int f;        while((f=dfs(s,t,INF))>0)            flow+=f;    }}int main(){    int T;    while(cin>>T)    {        for(int kase=1;kase<=T;kase++)        {            for(int i=0;i<MAX;i++)                G[i].clear();            int n,m;            cin>>n>>m;            for(int i=0;i<m;i++)            {                int x,y,z;                scanf("%d%d%d",&x,&y,&z);                add(x,y,z);            }            cout<<"Case "<<kase<<": "<<max_flow(1,n)<<endl;        }    }    return 0;}



0 0