您的位置:首页 > 理论基础 > 计算机网络

线性规划与网络流24——飞行员配对方案问题

2017-01-18 13:40 387 查看
题目链接点这里

二分图最大匹配裸题~

不过需要输出方案,,这题体现匈牙利算法的一个性质是  match [i]==-1时,,i比为非匹配点,,match[i]!=-1是,,比为匹配点

#include<iostream>
#include<map>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<set>
#include<string.h>
#include<string>
#include<vector>
#define MX 1111
#define INF 0x3f3f3f3f
#define mem(x,y) memset(x,y,sizeof(x))
#define FIN freopen("input.txt","r",stdin)
using namespace std;
int nx,ny;
int head[MX],rear;
struct Edge
{
    int nxt,to;
} edge[1111*MX];
void edge_init()
{
    mem(head,-1);
    rear=0;
}
void edge_add(int a,int b)
{
    edge[rear].to=b;
    edge[rear].nxt=head[a];
    head[a]=rear++;
}
bool vis[MX];
int matchxy[MX],matchyx[MX];
bool hungarian_dfs(int u)
{
    for(int i=head[u]; ~i; i=edge[i].nxt)
    {
        int v=edge[i].to;
        if(vis[v]) continue;
        vis[v]=1;
        if(matchyx[v]==-1||hungarian_dfs(matchyx[v]))
        {
            matchyx[v]=u;
            matchxy[u]=v;
            return 1;
        }
    }
    return 0;
}
int hungarian()
{
    mem(matchxy,-1);
    mem(matchyx,-1);
    int ret=0;
    for(int i=1; i<=nx; i++)
    {
        mem(vis,0);
        ret+=hungarian_dfs(i);
    }
    return ret;
}
int main()
{
    //FIN;
    while(cin>>nx>>ny)
    {
        int a,b;
        edge_init();
        while(cin>>a>>b,a!=-1)
        {
            edge_add(a,b);
            edge_add(b,a);
        }
        int ans=hungarian();
        if(ans==0) puts("No Solution!");
        else
        {
            printf("%d\n",ans);
            for(int i=nx+1; i<=nx+ny; i++)  if(matchxy[i]!=-1)printf("%d %d\n",matchxy[i],i);
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: