HDOJ 1816 – Get Luffy Out * 構圖2-sat…

來源:互聯網
上載者:User

      題意:

                                   和POJ2723差不多....唯一的區別在於前一題是把2N個要使分成了N對..而本題是組成了N對..說明可能有些鑰匙出現在多個pair中...

      題解:

                             上一題是以每一pair取哪一個來構圖的...而本題就以每個鑰匙拿還是不拿來構圖....pair是有N個..而鑰匙是有2N個..範圍要留意...

Program:

#include<iostream>#include<stdio.h>#include<string.h>#include<cmath>#include<queue>#include<stack>#include<set>#include<time.h>#include<map>#include<algorithm>#define ll long long#define eps 1e-5#define oo 10007#define pi acos(-1.0)#define MAXN 5005<<1#define MAXM 5000005<<1using namespace std;  struct node{      int y,next;}line[MAXM]; int Lnum,_next[MAXN],key[MAXN][2],door[MAXN][2];int dfn[MAXN],low[MAXN],tp[MAXN],tpnum,DfsIndex;bool instack[MAXN];stack<int> mystack;void addline(int x,int y){      line[++Lnum].next=_next[x],_next[x]=Lnum,line[Lnum].y=y;}void tarjan(int x){      instack[x]=true,mystack.push(x);      dfn[x]=low[x]=++DfsIndex;      for (int k=_next[x];k;k=line[k].next)      {             int y=line[k].y;             if (!dfn[y])             {                   tarjan(y);                   low[x]=min(low[x],low[y]);             }else             if (instack[y])                   low[x]=min(low[x],dfn[y]);      }      if (low[x]==dfn[x])      {             tpnum++;             do             {                     x=mystack.top();                     mystack.pop();                     instack[x]=false;                     tp[x]=tpnum;             }while (low[x]!=dfn[x]);      }}bool _2sat(int N,int M){      int i,m,k;      Lnum=0,memset(_next,0,sizeof(_next));       for (i=1;i<=M;i++)       {             int x=door[i][0],y=door[i][1];              addline(x<<1,y<<1|1),addline(y<<1,x<<1|1); //對於一個門..必定是其中一把開啟      }      for (i=0;i<N;i++)      {             int x=key[i][0],y=key[i][1];             addline(x<<1|1,y<<1),addline(y<<1|1,x<<1); //每對至多取一個鑰匙      }       memset(dfn,0,sizeof(dfn));      memset(instack,false,sizeof(instack));      while (!mystack.empty()) mystack.pop();      DfsIndex=tpnum=0;      for (i=0;i<(N<<2);i++)         if (!dfn[i]) tarjan(i);      for (i=0;i<(N<<1);i++)         if (tp[i<<1]==tp[i<<1|1]) return false;       return true;}int main(){             int N,M,i;       while (~scanf("%d%d",&N,&M) && N)      {              for (i=0;i<N;i++)  scanf("%d%d",&key[i][0],&key[i][1]);                for (i=1;i<=M;i++) scanf("%d%d",&door[i][0],&door[i][1]);              int l=0,r=M+1,mid;              while (r-l>1)              {                     mid=l+r>>1;                     if (!_2sat(N,mid)) r=mid;                           else l=mid;              }              printf("%d\n",l);      }      return 0;}  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.