URAL-1997 Those are not the droids you're looking for 二分匹配

  题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1997

  题意:记录了n个人进出门的时间点,每个人在房子里面待的时间要么小于等于a,要么大于等于b,询问能否对进出门的时间点找到一个合适的匹配。

  对于满足的要求建立边即可,然后看是否能找到最大匹配。

  1 //STATUS:C++_AC_109MS_4361KB
  2 #include <functional>
  3 #include <algorithm>
  4 #include <iostream>
  5 //#include <ext/rope>
  6 #include <fstream>
  7 #include <sstream>
  8 #include <iomanip>
  9 #include <numeric>
 10 #include <cstring>
 11 #include <cassert>
 12 #include <cstdio>
 13 #include <string>
 14 #include <vector>
 15 #include <bitset>
 16 #include <queue>
 17 #include <stack>
 18 #include <cmath>
 19 #include <ctime>
 20 #include <list>
 21 #include <set>
 22 #include <map>
 23 using namespace std;
 24 //#pragma comment(linker,"/STACK:102400000,102400000")
 25 //using namespace __gnu_cxx;
 26 //define
 27 #define pii pair<int,int>
 28 #define mem(a,b) memset(a,b,sizeof(a))
 29 #define lson l,mid,rt<<1
 30 #define rson mid+1,r,rt<<1|1
 31 #define PI acos(-1.0)
 32 //typedef
 33 typedef __int64 LL;
 34 typedef unsigned __int64 ULL;
 35 //const
 36 const int N=1010;
 37 const int INF=0x3f3f3f3f;
 38 const int MOD=95041567,STA=8000010;
 39 const LL LNF=1LL<<60;
 40 const double EPS=1e-8;
 41 const double OO=1e15;
 42 const int dx[4]={-1,0,1,0};
 43 const int dy[4]={0,1,0,-1};
 44 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 45 //Daily Use ...
 46 inline int sign(double x){return (x>EPS)-(x<-EPS);}
 47 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
 48 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
 49 template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
 50 template<class T> inline T Min(T a,T b){return a<b?a:b;}
 51 template<class T> inline T Max(T a,T b){return a>b?a:b;}
 52 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
 53 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
 54 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
 55 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
 56 //End
 57 
 58 int vis[N],y[N],w[N][N],t[N][2],id[N],l[N],r[N];
 59 int n,a,b,cnt1,cnt2;
 60 
 61 int dfs(int u)
 62 {
 63     int v;
 64     for(v=0;v<cnt1;v++){
 65         if(vis[v] || !w[u][v])continue;
 66         vis[v]=1;
 67         if(y[v]==-1 || dfs(y[v])){
 68             y[v]=u;
 69             return 1;
 70         }
 71     }
 72     return 0;
 73 }
 74 
 75 int main()
 76 {
 77  //   freopen("in.txt","r",stdin);
 78     int i,j,L,R,ok;
 79     while(~scanf("%d%d",&a,&b))
 80     {
 81         L=b+1,R=a-1;
 82         scanf("%d",&n);
 83         cnt1=cnt2=0;
 84         for(i=0;i<n;i++){
 85             scanf("%d%d",&t[i][0],&t[i][1]);
 86             if(t[i][1]){
 87                 l[cnt1]=i;
 88                 id[i]=cnt1++;
 89             }
 90             else {
 91                 r[cnt2]=i;
 92                 id[i]=cnt2++;
 93             }
 94         }
 95         mem(w,0);
 96         for(i=0;i<n;i++){
 97             if(t[i][1]==0)continue;
 98             for(j=i-1;j>=0;j--){
 99                 if(t[j][1]==1)continue;
100                 if(t[i][0]-t[j][0]>=L && t[i][0]-t[j][0]<=R)continue;
101                 w[id[i]][id[j]]=1;
102             }
103         }
104         mem(y,-1);ok=1;
105         for(i=0;i<cnt1;i++){
106             mem(vis,0);
107             if(dfs(i)==0){
108                 ok=0;
109                 break;
110             }
111         }
112 
113         if(ok){
114             printf("No reason
");
115             for(i=0;i<cnt1;i++){
116                 printf("%d %d
",t[r[i]][0],t[ l[ y[i] ] ][0]);
117             }
118         }
119         else printf("Liar
");
120 
121     }
122     return 0;
123 }
原文地址:https://www.cnblogs.com/zhsl/p/3398320.html