第一次发文,就是一些学习的心得而已,自己忘得时候就可以来看看,好了废话不多说,直接说说这题的思路。

题意大概是每列只能射中一个白格子,每行可以射多个,让你输出这样的序列,明显的二分图求匹配,用列去选行就可以了,但是列有可能比行数大,所以就分两种情况。只有匹配值等于行数才有解,不然无解,当列数大于行数时在得到的序列尾部加点东西就好了(再多余出的列里每列随便选个白格子)

上代码,刚开始是用vector建的图,然后叫上去就报运行错误,找了好久没发现错误,一气之下改成矩阵直接撸........=。=

  #include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define maxn 1050 using namespace std; int link[maxn],vis[maxn];
int g[maxn][maxn];
int r,c; int dfs(int x)
{
for(int i=;i<=r;i++)
{
if(g[x][i]&&!vis[i])
{
vis[i]=;
if(link[i]==-||dfs(link[i]))
{
link[i]=x;
return ;
}
}
}
return ;
}
void solve()
{
int sum=;
memset(link,-,sizeof(link));
for(int i=;i<=r;i++)
{
memset(vis,,sizeof(vis));
if(dfs(i)) sum++;
}
// printf("%d\n",sum);
if(sum==r)
{
for(int j=;j<r;j++)
printf("%d ",link[j]);
printf("%d",link[r]);
for(int k=r+;k<=c;k++)
{
for(int l=;l<=r;l++)
{
if(g[l][k])
{
printf(" %d",l);
break;
}
}
}
puts("");
}
else puts("NO");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&r,&c);
memset(g,,sizeof(g));
for(int i=;i<=c;i++)
{
int a,b;
scanf("%d %d",&a,&b);
g[a][i]=g[b][i]=;
}
solve();
}
return ;
}

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define maxn 1050

using namespace std;

int link[maxn],vis[maxn];
int g[maxn][maxn];
int r,c;

int dfs(int x)
{
for(int i=1;i<=r;i++)
{
if(g[x][i]&&!vis[i])
{
vis[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=x;
return 1;
}
}
}
return 0;
}
void solve()
{
int sum=0;
memset(link,-1,sizeof(link));
for(int i=1;i<=r;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) sum++;
}
// printf("%d\n",sum);
if(sum==r)
{
for(int j=1;j<r;j++)
printf("%d ",link[j]);
printf("%d",link[r]);
for(int k=r+1;k<=c;k++)
{
for(int l=1;l<=r;l++)
{
if(g[l][k])
{
printf(" %d",l);
break;
}
}
}
puts("");
}
else puts("NO");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&r,&c);
memset(g,0,sizeof(g));
for(int i=1;i<=c;i++)
{
int a,b;
scanf("%d %d",&a,&b);
g[a][i]=g[b][i]=1;
}
solve();
}
return 0;
}

POJ1719二分匹配的更多相关文章

  1. POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24081   Accepted: 106 ...

  2. [kuangbin带你飞]专题十 匹配问题 二分匹配部分

    刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...

  3. BZOJ 1189 二分匹配 || 最大流

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1155  Solved: 420[Submi ...

  4. Kingdom of Obsession---hdu5943(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:给你两个数n, s 然后让你判断是否存在(s+1, s+2, s+3, ... , s+n ...

  5. poj 2060 Taxi Cab Scheme (二分匹配)

    Taxi Cab Scheme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5710   Accepted: 2393 D ...

  6. [ACM_图论] Sorting Slides(挑选幻灯片,二分匹配,中等)

    Description Professor Clumsey is going to give an important talk this afternoon. Unfortunately, he i ...

  7. [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)

    描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们 ...

  8. nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...

  9. UVA5874 Social Holidaying 二分匹配

    二分匹配简单题,看懂题意,建图比较重要. #include<stdio.h> #include<string.h> #define maxn 1100 int map[maxn ...

随机推荐

  1. 远程调试工具weinre使用教程

    一:前言 我们都知道,chrome的开发者工具(f12)是一个方便我们调试PC页面的工具.但是现在我们的开发离不开移动端,那如果我们需要对手机页面进行调试,那该怎么办了? 当然,chrome的开发者工 ...

  2. java join 方法的使用

    在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束.这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据 ...

  3. ubuntu 14.04 安装minidwep-gtk

    一,安装相关的依赖 sudo apt-get install build-essential libssl-dev iw libpcap-dev sqlite3 libsqlite3-dev libp ...

  4. c# winform 关于DataGridView的一些操作

    转自:http://heisetoufa.iteye.com/blog/405317 设置字段名 设置字段值 设定单元格表示 Error图标 设定当前单元格 取得当前单元格内容 取得当前单元格的列 I ...

  5. hihoCoder #1050 : 树中的最长路

    题意: 求出树上最长路径的长度,并返回. 思路: 刚看到数据<=10^5,假如是单分支的树,那么有5万层,就不能递归,那就用桟实现, 那就要将长度信息保存在另开的数组中,很麻烦!!这题专门给递归 ...

  6. Java 守护线程(Daemon) 例子

    当我们在Java中创建一个线程,缺省状态下它是一个User线程,如果该线程运行,JVM不会终结该程序.当一个线被标记为守护线程,JVM不会等待其结束,只要所有用户(User)线程都结束,JVM将终结程 ...

  7. CornerStone使用跳坑总结

    Cornerstone是专门为Mac用户设计的Subversion(SVN)的控制,使版本控制更加透明.cornerstone根Xcode相比,能够更好的忽略文件,所以除了项目经理第一次初始化项目的时 ...

  8. *运算和&运算

    /* &:取地址运算符 *:指针运算符(或称为间接运算符),取指针所指向的对象的内容 */ int a,b; int *pointer_1, *pointer_2; pointer_1 = & ...

  9. Yii2应用的运行过程

    每一个框架都有一个入口脚本,Yii2也不例外.一般来说,对于Web应用的入口脚本是YiiBasePath/frontend/web目录下的index.php. 先观察这个文件: <?php de ...

  10. A. Vitya in the Countryside

    A. Vitya in the Countryside time limit per test 1 second memory limit per test 256 megabytes input s ...