HDU3605 Escape 多重匹配

2014-11-24 00:40:35 · 作者: · 浏览: 3
给出每个人适合住的星球信息和该星球能住多少人,第一行给出n m 代表有 n 个人 m 个星球,然后接下来n行每行m个数字 ,代表可以住到第 i 个星球,0代表不可以住到第 i 个星球,最后一行m个数表示第 i 个星球最多可以住多少个人,问是不是所有人都可以搬离地球,
以前的匹配左集合 中一个点 对应右集合中的一个点,点只能使用一次,现在变成左集合中的一个点对应右集合中的多个点,而右集合中的点还是只能对应左集合中的一个点,
这道题目一开始做一直是超时的,直到修改了一个地方就过了,个人觉得是 题目数据不好,又是900ms
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
  
#define ll long long  
#define LL __int64  
#define eps 1e-8  
const ll INF=9999999999999;  
  
using namespace std;  
  
#define M 400000100  
  
#define inf 0xfffffff  
  
//vector > G;  
//typedef pair P;  
//vector> ::iterator iter;  
//  
//mapmp;  
//map::iterator p;  
  
//vectorG[8000];  
  
int mp[100012][22];  
int num[22];  
int marry[22];  
bool vis[22];  
int tempmp[22][100012];  
  
int dis[2][4]={0,-1,0,1,1,0,-1,0};  
  
int n,m,k;  
  
void clear()  
{  
    memset(tempmp,0,sizeof(tempmp));  
    memset(marry,0,sizeof(marry));  
    memset(num,0,sizeof(num));  
    memset(vis,false,sizeof(vis));  
    memset(mp,0,sizeof(mp));  
    /*for(int i=0;i<=n;i++) 
        G[i].clear();*/  
}  
  
bool dfs(int x)  
{  
    for(int i=0;i
>n>>m) { clear(); for(int i=0;i