举栗子
I’m Telling the Truth HDU - 3729
#include<bits/stdc++.h>
using namespace std;
const int maxn=77;
const int maxs=1e5+7;
bool vis[maxs];
vector<int> vec;
vector<int> G[maxn];
int book[maxs];
int n;
bool dfs(int x)
{
int len=G[x].size();
for(int i=0;i<len;i++){
int t=G[x][i];
if(!vis[t])
{
vis[t]=true;
if(!book[t]||dfs(book[t]))
{
book[t]=x;
return true;
}
}
}
return false;
}
void init()
{
vec.clear();
memset(book,0,sizeof book);
for(int i=1;i<=n;i++)
G[i].clear();
}
void Search()
{
for(int i=n;i>=1;i--)
{
memset(vis,false,sizeof vis);
if(dfs(i))
vec.push_back(i);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
for(int j=x;j<=y;j++)
G[i].push_back(j);
}
Search();
int len=vec.size();
printf("%d\n",len);
for(int i=len-1;i>=0;i--)
{
if(i!=len-1)
printf(" ");
printf("%d",vec[i]);
}
printf("\n");
}
return 0;
}
Asteroids POJ - 3041
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=507;
bool vis[maxn];
vector<int> G[maxn];
int book[maxn];
int n,ans;
bool dfs(int x)
{
int len=G[x].size();
for(int i=0;i<len;i++)
{
int t=G[x][i];
if(!vis[t])
{
vis[t]=true;
if(!book[t]||dfs(book[t]))
{
book[t]=x;
return true;
}
}
}
return false;
}
//void init()
//{
// memset(book,0,sizeof book);
// for(int i=1;i<=n;i++)
// G[i].clear();
//}
void Search()
{
for(int i=1;i<=n;i++)
{
memset(vis,false,sizeof vis);
if(dfs(i))
ans++;
}
}
int main()
{
int k;
scanf("%d%d",&n,&k);
// init();
while(k--)
{
int r,c;
scanf("%d%d",&r,&c);
G[r].push_back(c);
}
Search();
printf("%d",ans);
return 0;
}
Courses HDU - 1083
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=307;
bool vis[maxn];
vector<int> G[maxn];
int book[maxn];
int p,n,ans;
bool dfs(int x)
{
int len=G[x].size();
for(int i=0;i<len;i++)
{
int t=G[x][i];
if(!vis[t])
{
vis[t]=true;
if(!book[t]||dfs(book[t]))
{
book[t]=x;
return true;
}
}
}
return false;
}
void init()
{
ans=0;
memset(book,0,sizeof book);
for(int i=1;i<=p;i++)
G[i].clear();
}
void Search()
{
for(int i=1;i<=p;i++)
{
memset(vis,false,sizeof vis);
if(dfs(i))
ans++;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d",&p,&n);
for(int i=1;i<=p;i++)
{
int k;
scanf("%d",&k);
while(k--)
{
int s;
scanf("%d",&s);
G[i].push_back(s);
}
}
Search();
if(ans>=p)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}