标签:des style blog http color io os ar java
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2198 Accepted Submission(s): 722
题目的意思是求出符合条件的能去到的最大深度 。
然后 x 只有 0 , 1 两种 。
明显就是一个 two - sat .
然后二分一个深度 , 重新构图 , 看下所有限制能否都符合 。
卡了一下二分 。 。
构图我是反向的 , 即 u - v 表示这两个条件不能共存
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <map> using namespace std; typedef long long LL; const int N = 20010; const int M = 800010; int eh[N] , et[M], nxt[M] , tot ; bool mark[N] ; int n , s , a[N] , b[N] ,c[N]; int st[N] , top ; void addedge(int u , int v ) { et[tot] = v , nxt[tot] = eh[u] , eh[u] = tot++; et[tot] = u , nxt[tot] = eh[v] , eh[v] = tot++; } void init() { memset (mark , false , sizeof mark ); tot = 0 ; memset ( eh , -1 , sizeof eh ); } // ---------------- bool dfs( int u ) { if( mark[u] ) return true ; if( mark[u^1] ) return false ; mark[u] = true; st[top++] = u ; for( int i = eh[u] ; ~i ; i = nxt[i] ){ int v = et[i] ; if( !dfs( v^1 ) ) return false; } return true ; } bool solve( int m ) { init(); for( int i = 0 ; i < m ; ++i ){ if( c[i] == 0 ){ addedge( 2*a[i] , 2*b[i] ); } else if( c[i] == 1 ){ addedge( (2*a[i])^1 , 2*b[i] ); addedge( (2*b[i])^1 , 2*a[i] ); } else { addedge( (2*a[i])^1 , (2*b[i])^1 ); } } for( int i = 0 ; i < 2 * n ; i+=2 ){ if( !mark[i] && !mark[i+1] ){ top = 0 ; if( !dfs(i) ){ while( top > 0 ) mark[ st[--top] ] = false ; if( !dfs(i+1) ) return false ; } } } return true; } void run() { int m ; scanf("%d%d",&n,&m); for( int i = 0 ; i < m ;++i ) scanf("%d%d%d",&a[i],&b[i],&c[i]); int ans = 1 , l = 1 ,r = m ; while( l <= r ){ int mid = ( l + r ) / 2; // cout << mid <<‘ ‘<<endl ; if( solve(mid) ) l = mid + 1 , ans = mid ; else r = mid - 1; } printf("%d\n",ans); } int main() { #ifdef LOCAL freopen("in","r",stdin); #endif int _ ; scanf("%d",&_); while( _ -- )run(); return 0; }
标签:des style blog http color io os ar java
原文地址:http://www.cnblogs.com/hlmark/p/4020360.html