poj 2723 Get Luffy Out
2012-07-09 11:37
239 查看
题目链接:http://poj.org/problem?id=2723
题目大意:
有N对钥匙(每一对只能选一把),M个门,每个门可用两把钥匙(这两把可能一样,可能不一样,只要有其中一把便可开门),门按给定的顺序排下来,必须开完1号门才能开2号门....直到开完,问最多能开几个门.
题目思路:
相对明显的2-SAT.
设有一把钥匙x,x表示选,~x表示不选.
如果有一对钥匙a,b,则a->~b,b->~a,即a,b不同时存在.
如果有一个门的所需要的钥匙是a,b,则~a->b,~b->a,即a,b不同时不存在.
代码:
题目大意:
有N对钥匙(每一对只能选一把),M个门,每个门可用两把钥匙(这两把可能一样,可能不一样,只要有其中一把便可开门),门按给定的顺序排下来,必须开完1号门才能开2号门....直到开完,问最多能开几个门.
题目思路:
相对明显的2-SAT.
设有一把钥匙x,x表示选,~x表示不选.
如果有一对钥匙a,b,则a->~b,b->~a,即a,b不同时存在.
如果有一个门的所需要的钥匙是a,b,则~a->b,~b->a,即a,b不同时不存在.
代码:
#include <stdlib.h> #include <string.h> #include <stdio.h> #include <ctype.h> #include <math.h> #include <time.h> #include <stack> #include <queue> #include <map> #include <set> #include <vector> #include <string> #include <iostream> #include <algorithm> using namespace std; #define ull unsigned __int64 //#define ll __int64 //#define ull unsigned long long #define ll long long #define son1 New(p.xl,xm,p.yl,ym),(rt<<2)-2 #define son2 New(p.xl,xm,min(ym+1,p.yr),p.yr),(rt<<2)-1 #define son3 New(min(xm+1,p.xr),p.xr,p.yl,ym),rt<<2 #define son4 New(min(xm+1,p.xr),p.xr,min(ym+1,p.yr),p.yr),rt<<2|1 #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define middle (l+r)>>1 #define MOD 1000000007 #define esp (1e-8) const int INF=0x3F3F3F3F; const double DINF=10000.00; //const double pi=acos(-1.0); const int M=5010; int min(int x,int y){return x<y? x:y;} int max(int x,int y){return x>y? x:y;} void swap(int& x,int& y){int t=x;x=y;y=t;} int T,cas; vector<int>init[M]; int low[M],pre[M],idx[M],ss[M],Hash[M]; int n,nn,Index,top,m,N; void dfs(int u){ low[u]=pre[u]=++Index; ss[++top]=u; for(int i=0;i<init[u].size();i++){ int v=init[u][i]; if(pre[v]==-1) dfs(v),low[u]=min(low[u],low[v]); else if(idx[v]==-1) low[u]=min(low[u],pre[v]); } if(low[u]==pre[u]){ int v=-1; ++nn; while(u!=v) idx[v=ss[top--]]=nn; } } void Tarjan(){ memset(idx,-1,sizeof(int)*(n+1)); memset(pre,-1,sizeof(int)*(n+1)); Index=top=nn=0,ss[0]=-1; for(int u=1;u<=n;u++) if(pre[u]==-1) dfs(u); } bool _sof(){ Tarjan(); for(int i=1;i<=n;i+=2) if(idx[i]==idx[i+1]) return false; return true; } void _init(){ int u,uu,v,vv,i; for(i=1,n=N<<2;i<=n;i++) init[i].clear(); for(i=0;i<N;i++){ scanf("%d%d",&u,&v); u=u<<1|1,uu=u+1; v=v<<1|1,vv=v+1; init[u].push_back(vv); init[v].push_back(uu); } int ret=0; for(i=1;i<=m;i++){ scanf("%d%d",&u,&v); u=u<<1|1,uu=u+1; v=v<<1|1,vv=v+1; init[uu].push_back(v); init[vv].push_back(u); if(_sof()) ret=i; } printf("%d\n",ret); } int main(){ //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); //_init() //scanf("%d",&T);for(cas=1;cas<=T;cas++) _init(); while(scanf("%d%d",&N,&m) && (N||m)) _init(); return 0; }
相关文章推荐
- poj 2723 Get Luffy Out(2-sat构图题)
- POJ 2723 Get Luffy Out(2-ST)
- 2-sat->poj 2723 Get Luffy Out
- poj 2723 Get Luffy Out 2sat
- 2-SAT ( Tarjan )——Get Luffy out ( POJ 2723 )
- 2-sat系列(一) POJ 2723 Get Luffy Out
- poj 2723 Get Luffy Out(图论-2-sat)
- poj 2723 Get Luffy Out 【2-sat + 二分查找判断可行性】
- POJ 2723 - Get Luffy Out(2-SAT)
- POJ 2723 Get Luffy Out(2-SAT)
- POJ 2723 Get Luffy Out 2-SAT&&二分搜索
- [2-sat+二分]poj 2723 Get Luffy Out
- poj 2723 Get Luffy Out 二分+2-SAT
- Get Luffy Out (poj 2723 二分+2-SAT)
- POJ 2723 Get Luffy Out (2-SAT)
- POJ 2723 Get Luffy Out(2-SAT + 二分)
- HDU 1816, POJ 2723 Get Luffy Out(2-sat)
- poj 2723 Get Luffy Out
- POJ 2723 Get Luffy Out
- Poj 2723 Get Luffy Out【2-SAT---------Tarjan强连通】