LibreOj 6000 搭配飞行员

来源:互联网 发布:python 生物信息 编辑:程序博客网 时间:2024/04/28 08:48

传送门

分析:

一道简单的网络流模板题,也可以用匈牙利算法写。

代码:

#include <bits/stdc++.h>using namespace std;const int maxn = 1e5;struct Edge{    int v , to;    int next;} edge[maxn];int head[maxn] , cnt , n , m , from , to;void add_edge(int from , int to , int v){    edge[cnt].to = to;    edge[cnt].v  = v;    edge[cnt].next = head[from];    head[from] = cnt++;}int level[maxn];bool bfs(){    memset(level , 0 , sizeof level);    level[from] = 1;    queue<int> que;    while(!que.empty()) que.pop();    que.push(from);    while(!que.empty())    {        int u = que.front();        que.pop();        for(int i=head[u]; i!=-1; i=edge[i].next)        {            if(!level[edge[i].to] && edge[i].v > 0)            {                level[edge[i].to] = level[u] + 1;                que.push(edge[i].to);            }        }    }    return level[to];}int cur[maxn] , numm = 0;int dfs(int u , int low){    if(u == to)    {        return low;    }    int a;    for(int &i=cur[u]; i!=-1; i=edge[i].next)    {        if(level[edge[i].to] == level[u] + 1 && edge[i].v > 0)        {            a = dfs(edge[i].to , min(low , edge[i].v));            if(a)            {                edge[i].v   -= a;                edge[i^1].v += a;                return a;            }        }    }    return 0;}int total;int solve(){    int sum = 0 , a;    while(bfs())    {        memcpy(cur , head , sizeof head);        while((a = dfs(from , 0x3f3f3f3f)))            sum += a;    }    return sum; }void init(){    memset(head , -1 , sizeof head);    cnt = 0 , total = 0;    from = 0 , to = m + n + 1;}int main(){    //freopen("data.in" , "r" , stdin);    scanf("%d %d" , &n , &m);    init();    int a , b;    while(~scanf("%d %d" , &a , &b))    {        add_edge(a , b , 1);        add_edge(b , a , 0);    }    for(int i=1; i<=m; i++)    {        add_edge(from , i , 1);        add_edge(i , from , 0);    }    for(int i=m+1; i<=n; i++)    {        add_edge(i , to , 1);        add_edge(to , i , 0);    }    printf("%d\n" , solve());    return 0;}