题意:
     给一个n*m的格子,每一列都有两个白色的,其余的全是黑色的,然后要选择m个格子,要求是每一列必须也只能选一个,而每一行至少选择一个,输出一种可行的方案没,输出的格式是输出m个数,表示每一列上选了第几行的数。

思路: 
     一开始看到每一行至少选择一个,都点蒙了,后来自己画了下,哎!SB了,比较简单的题目,题目的输入数据是说n<=m,那么也就是指存在两种情况,n=m和n<m,当n=m的时候就是每一行每一列至少也只能选一个,直接匹配就行了,而当n<m的时候也就是说每一个行至少一个,有的比一个多,那么我们就先用二分匹配给每一行都安排一个,然后剩下的没有安排的列,我们只要随便给挑一个就行了。

#include<stdio.h>
#include<string.h>

#define N_node 1000 + 10
#define N_edge 2000 + 20

typedef struct
{
    int to ,next;
}STAR;

typedef struct
{
    int a ,b;
}NODE;

STAR E[N_edge];
NODE node[N_node];
int list[N_node] ,tot;
int mkgx[N_node] ,mkdfs[N_node];

void add(int a ,int b)
{
    E[++tot].to = b;
    E[tot] .next = list[a];
    list[a] = tot;
}

int DFS_XYL(int x)
{
    for(int k = list[x] ;k ;k = E[k].next)
    {
        int to = E[k].to;
        if(mkdfs[to]) continue;
        mkdfs[to] = 1;
        if(mkgx[to] == -1 || DFS_XYL(mkgx[to]))
        {
            mkgx[to] = x;
            return 1;
        }
    }
    return 0;
}

int main ()
{
    int t ,n ,m ,i ,j;
    scanf("%d" ,&t);
    while(t--)
    {
        scanf("%d %d" ,&n ,&m);
        memset(list ,0 ,sizeof(list));
        for(i = 1 ;i <= m ;i ++)
        {
            scanf("%d %d" ,&node[i].a ,&node[i].b);
            add(node[i].a ,i);
            add(node[i].b ,i);
        }
        int Ans = 0;
        memset(mkgx ,255 ,sizeof(mkgx));
        for(i = 1 ;i <= n ;i ++)
        {
            memset(mkdfs ,0 ,sizeof(mkdfs));
            Ans += DFS_XYL(i);
        }
        if(Ans < n)
        {
            printf("NO\n");
            continue;
        }
        for(i = 1 ;i <= m ;i ++)
        {
            if(mkgx[i] == -1) Ans = node[i].a;
            else Ans = mkgx[i];
            if(i == m) printf("%d\n" ,Ans);
            else printf("%d " ,Ans);
        }
    }
    return 0;
}

POJ1719行列匹配相关推荐

  1. 二分图行列匹配--- hdu2119,hdu1498

    hdu2119 题意:给定一个矩形方格,每个格子里面的数字是0或者1,每次操作可以把一整行或列的1变成0,问最少多少次操作能将1全部变为0 一次可以消除某一行或者某一列的1 但是可以这么想,最多有多少 ...

  2. POJ2226 不错的最小顶点覆盖

    题意:        给你一个n * m 的矩阵,上面有" * " 和 " . " ,让你用少的木板吧所有" * "覆盖,木板宽度是1,长度 ...

  3. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  4. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. [刷题记录] luogu网络流24题 及 网络流心得体会 及 经典模型不定期更新

    文章目录 信息汇总表格 飞行员配对方案问题 分配问题 运输问题 数字梯形问题 最小路径覆盖问题 魔术球问题 圆桌问题 试题库问题 深海机器人问题 航空路线问题 火星探险问题 太空飞行计划问题 方格取数 ...

  7. 图论复习(各类习题)

    可以结合这篇博客进行复习:http://www.cnblogs.com/z360/p/7363034.html 一.强连通分量.缩点 习题: 洛谷--P2746 [USACO5.3]校园网Networ ...

  8. Python实现excel表合入

    import logging import datetime import os import sys import openpyxl import tkinter as Tk# 将该表的数据汇总到另 ...

  9. 推荐一个有用的Excel操作类库 LinqToExcel

    GitHub: LinqToExcel 以前项目中对Excel进行信息读取,我都是使用的NPOI的封装类,给定一个fileurl,然后返回给我一个datatable.接下去自己去解析数据.如果使用这种 ...

最新文章

  1. wordpress怎么修改html,WordPress后台编辑器HTML模式界面中添加修改删除按钮
  2. OKR会议的7个步骤
  3. .NET Framework 3.5 SP1 bootstrapper 包(安装和部署)的解决方法
  4. Pat乙级1089 狼人杀-简单版
  5. 通过sql-labs进行sql注入学习(11-22)
  6. SQL基础【五、Where】
  7. Python实现八皇后问题
  8. roboware实用功能
  9. 极客唐小娟的故事-值得我们思考
  10. java countdowntimer_(六)Android中使用CountDownTimer实现倒计时功能
  11. ZooKeeper 会话的秘密
  12. C语言开定时器做呼吸灯程序,用定时器实现呼吸灯程序
  13. codeforces 158B
  14. No suitable context info for active keying set问题(已解决)
  15. 微信小程序获取今日天气预报api 免费接口
  16. Apollo beta公测版本安装
  17. [数学]导数与微积分(第一部分)
  18. 软件导刊三审被退稿_【软件导刊】省级期刊_计算机杂志_91学术
  19. [KVM应用案例] 湖南电视台高清电视转播车KVM矩阵项目
  20. Mac如何查看隐藏文件夹

热门文章

  1. [发布]Lucene索引分析工具Luke.Net 0.5升级版 (兼容Lucene.Net 2.9.4.1)
  2. Mysql (一)Mysql 数据库增删改查
  3. 【Mongodb】如何创建mongodb的replica set
  4. appium运行报错java.net.SocketException: socket write error
  5. java基础 关于转换流
  6. Java集合源码学习(五)几种常用集合类的比较
  7. HDU2552 三足鼎立 【数学推理】
  8. Java编程中写出好代码的建议
  9. 解决虚拟机vmware安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题...
  10. pip virtualenv requirements