G - Go Deeper

Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

Description

Here is a procedure's pseudocode:

 
	   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

In this code n is an integer. abc and x are 4 arrays of integers. The index of array always starts from 0. Array a and b consist of non-negative integers smaller than n. Array x consists of only 0 and 1. Array c consists of only 0, 1 and 2. The lengths of array ab and c are mwhile the length of array x is n.

Given the elements of array ab, and c, when we call the procedure go(0, n , m) what is the maximal possible value does the procedure output?

Input

There are multiple test cases. The first line of input is an integer T (0 < T ≤ 100), indicating the number of test cases. Then T test cases follow. Each case starts with a line of 2 integers n and m (0 < n ≤ 200, 0 < m ≤ 10000). Then m lines of 3 integers follow. The i-th(1 ≤ i ≤m) line of them are ai-1 ,bi-1 and ci-1 (0 ≤ ai-1bi-1 < n, 0 ≤ ci-1 ≤ 2).

Output

For each test case, output the result in a single line.

Sample Input

3
2 1
0 1 0
2 1
0 0 0
2 2
0 1 0
1 1 2

Sample Output

1
1
2 题目大意:
 
给定一些方程,x[]数组未知,求前面最多能够有多少方程x[a]+x[b]!=c能够被满足。
 其中 c=0,1,2
  x[]={0,1}
相当于裸的2sat问题,加上二分
  
  强烈建议阅读 kuangbin大神对2-sat的总结:http://www.cnblogs.com/kuangbin/archive/2012/10/05/2712429.html 总的来说,就是当 a or b 时 连接 a' -> b 与 b' -> a 的边,然后进行强连通判断是否出现 a 与 a' ...在同一个连通分量中,若在则不可能。 建立数a的两个状态,即a与a',相当于x[a]=1 和 x[a']=0 x[a]+x[b]!=0 => a or b => a'->b 且 a->b'
x[a]+x[b]!=1 => (a and b) or (a' and b') == a or b' 且 a' or b => a'->b' 且 b->a 且 a->b 且 b'->a
x[a]+x[b]!=2 => a' or b' => a->b' 且 a'->b 按上面来建图判断即可
#include<cstdio>
#include<cstring>
int e[],pd[],be[],ne[],all;
int dfn[],low[],instack[],belong[],stack[],stak,curr,num;
int a,b,c,n,m,l,r,mid,flag;
void add(int x,int y,int p){
e[++all]=y;
pd[all]=p;
ne[all]=be[x];
be[x]=all;
}
void tarjan(int x){
instack[x]=;
stack[++stak]=x;
dfn[x]=low[x]=++curr;
for(int j=be[x];j!=;j=ne[j])
if(pd[j]<=mid){
if(!dfn[e[j]]){
tarjan(e[j]);
if(low[x]>low[e[j]]) low[x]=low[e[j]];
}else if(instack[e[j]]&&low[x]>low[e[j]])
low[x]=low[e[j]];
}
if(dfn[x]==low[x]){
int j;
++num;
do{
j=stack[stak--];
instack[j]=;
belong[j]=num;
}while(j!=x);
}
}
int solve(){
curr=stak=num=;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(instack,,sizeof(instack));
for(int i=;i<*n;i++)
if(!dfn[i]) tarjan(i);
flag=;
for(int i=;i<n;i++)
if(belong[*i]==belong[*i+]){
flag=;
break;
}
return flag;
}
int main()
{
int tt;
scanf("%d",&tt);
while(tt--){
scanf("%d%d",&n,&m);
all=;
memset(e,,sizeof(e));
memset(be,,sizeof(be));
memset(ne,,sizeof(ne));
memset(pd,,sizeof(pd));
for(int i=;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
switch (c){
case : add(*a+,*b,i);
add(*b+,*a,i);
break;
case : add(*a,*b,i);
add(*b+,*a+,i);
add(*b,*a,i);
add(*a+,*b+,i);
break;
case : add(*a,*b+,i);
add(*b,*a+,i);
break;
}
}
l=;r=m-;
while(l<r-){
mid=(l+r)/;
if(solve()) r=mid; else l=mid;
}
mid=r;
if(!solve()) printf("%d\n",r+);
else printf("%d\n",l+);
}
return ;
}

Go Deeper(2010成都现场赛题)(2-sat)的更多相关文章

  1. Error Curves(2010成都现场赛题)

    F - Error Curves Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Descript ...

  2. 2011 ACM/ICPC 成都赛区(为2013/10/20成都现场赛Fighting)

    hdu 4111  Alice and Bob 博弈:http://www.cnblogs.com/XDJjy/p/3350014.html hdu 4112 Break the Chocolate ...

  3. HDU 4119Isabella's Message2011成都现场赛I题(字符串模拟)

    Isabella's Message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. hdu 4788 (2013成都现场赛 H题)

    100MB=10^5KB=10^8B 100MB=100*2^10KB=100*2^20B Sample Input2100[MB]1[B] Sample OutputCase #1: 4.63%Ca ...

  5. hdu 4465 Candy(2012 ACM-ICPC 成都现场赛)

    简单概率题,可以直接由剩余n个递推到剩余0个.现在考虑剩余x个概率为(1-p)的candy时,概率为C(2 * n - x, x) * pow(p, n + 1)  *pow(1 - p, n - x ...

  6. hdu 4465 Candy 2012 成都现场赛

    /** 对于大数的很好的应用,,缩小放大,,保持精度 **/ #include <iostream> #include <cmath> #include <algorit ...

  7. hdu 4472 Count (2012 ACM-ICPC 成都现场赛)

    递推,考虑到一n可以由i * j + 1组合出来,即第二层有j个含有i个元素的子树...然后就可以了.. #include<algorithm> #include<iostream& ...

  8. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  9. HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题

    第一年参加现场赛,比赛的时候就A了这一道,基本全场都A的签到题竟然A不出来,结果题目重现的时候1A,好受打击 ORZ..... 题目链接:http://acm.hdu.edu.cn/showprobl ...

随机推荐

  1. window对象的属性方法名造成的命名冲突

    事件起因: 一次开发中需要获取一个数组的长度,写下如此代码 function func(arr){ length = arr.length; ......//相关操作 } 程序在chrome下正常运行 ...

  2. Careercup - Google面试题 - 4807591515389952

    2014-05-06 00:45 题目链接 原题: What would happen if you have only one server for a web cache (a web brows ...

  3. 微信公众账号怎么获取微信原始ID

    阅读号获取如下,服务号不确定,见图: 进入你的微信公众账号的地址(https://mp.weixin.qq.com ),登录之后进入如下

  4. cadence16.6 中orcad导出网表时ERROR (ORCAP-5004)

    ORCAD网表输出时 ERROR (ORCAP-5004):Error  initializing COM  property   pages 之前遇到过这个问题,解决后忘了记录下来了.依稀记得问题答 ...

  5. 传说中的Markov"不过如此”

    因为看一篇题为 Passive Measurement of Interference in WiFi Network with Application in Misbehavior Detectio ...

  6. UVA 11149 Power of Matrix 快速幂

    题目链接: http://acm.hust.edu.cn/vjudge/contest/122094#problem/G Power of Matrix Time Limit:3000MSMemory ...

  7. SystemInfo.deviceUniqueIdentifier 返回机器码

    SystemInfo.deviceUniqueIdentifier 返回机器码

  8. Android 监听ListView、GridView滑动到底部

    // 监听listview滚到最底部 mIndexList.setOnScrollListener(new OnScrollListener() { @Override public void onS ...

  9. Tomcat启用Gzip压缩

    原理简介         HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并 浏览.相对于普通的 ...

  10. 第一个java程序(hdu 1001)

    //package yy;不能有 import java.util.*; public class Main {//必须为Main public static void main(String[] a ...