[关键字]:图论
[题目大意]:有n道题只能按顺序回答,每到题只能用两个锦囊中的一个,问最多答上多少道题。
//=================================================================================================
[分析]:一开始看着和一道POJ上的2-sat很像,想都没就开始做,然后我就2了……又仔细看了一遍2-sat的定义:(1)、有N各组每组只能出一个。(2)、某两个之间不能同时选。这道题明显不符和第一的条件,然后仔细一看居然是二分图!每到题想每个可以解开它的锦囊连边,然后求最大匹配。注意的是这道题是要求顺序的,所以要从1到m循环,并且一遇到找不到增广路的就break出来。
[代码]:
View Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1002;
int n,m,ans=0;
int match[MAXN],map[MAXN][3];
bool b[MAXN];
bool DFS(int u)
{
for (int i=1;i<=2;++i)
if (!b[map[u][i]])
{
b[map[u][i]]=1;
if (match[map[u][i]]==-1 || DFS(match[map[u][i]]))
{
match[map[u][i]]=u;
return 1;
}
}
return 0;
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=m;++i) scanf("%d%d",&map[i][1],&map[i][2]);
ans=0;
memset(match,255,sizeof(match));
for (int i=1;i<=m;++i)
{
memset(b,0,sizeof(b));
if (DFS(i)) ++ans; else break;
}
printf("%d\n",ans);
return 0;
}