HDOJ 3715 - Go Deeper 二分+2-sat判斷

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

               題意:

                         有這麼一個過程:

                         go(int dep, int n, int m)
                         begin
                                 output the value of dep.
                                 if dep < m and x[a[dep]] + x[b[dep]] != c[dep] then go(dep + 1, n, m)
                         end

                          其中x[]的值為0或1...c[]的值為0或1或2....現在告訴a[],b[],c[]..問這個過程最深可能是多少?

               題解

                         看這個過程..實際上當在m層沒辦法下去了.更深的層肯定也到不了了...所以滿足單調性...先讀入a[],b[],c[]...再二分M...構圖..2-sat..tarjan判斷....


Program:

#include<iostream>#include<stdio.h>#include<cmath>#include<queue>#include<stack>#include<string.h>#include<map>#include<set>#include<algorithm>#define oo 1000000007#define MAXN 50005<<1#define MAXM 500005<<1#define ll long longusing namespace std;  struct node{       int y,next;}line[MAXM];int A[MAXN],B[MAXN],C[MAXN],Lnum,_next[MAXN],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){       mystack.push(x),instack[x]=true;       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();                     tp[x]=tpnum;                     instack[x]=false;               }while (low[x]!=dfn[x]);       }}bool _2sat(int N,int M){       int i;       Lnum=0;       memset(_next,0,sizeof(_next));       for (i=1;i<=M;i++)       {               int a=A[i],b=B[i],c=C[i];                if (!c) addline(a<<1,b<<1|1),addline(b<<1,a<<1|1);               else               if (c==1)                {                     addline(a<<1,b<<1),addline(a<<1|1,b<<1|1);                     addline(b<<1,a<<1),addline(b<<1|1,a<<1|1);               }               else                if (c==2) addline(a<<1|1,b<<1),addline(b<<1|1,a<<1);       }       while (!mystack.empty()) mystack.pop();       memset(dfn,0,sizeof(dfn));       memset(instack,false,sizeof(instack));       DfsIndex=tpnum=0;       for (i=0;i<(N<<1);i++)          if (!dfn[i]) tarjan(i);        for (i=0;i<N;i++)          if (tp[i<<1]==tp[i<<1|1]) return false;       return true;}int main(){             int N,M,cases;        scanf("%d",&cases);       while (cases--)       {              scanf("%d%d",&N,&M);               for (int i=1;i<=M;i++) scanf("%d%d%d",&A[i],&B[i],&C[i]);              int l=0,r=M+1,mid;              while (r-l>1)              {                      mid=l+r>>1;                      if (_2sat(N,mid)) l=mid;                           else r=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.