原理非常简单的啦。然而我做了一道模板题做了一个多小时。。

hdu3052:

WA了一个小时。我实在放弃了。于是上个厕所。突然想到了些什么,回到电脑前淡定的把一个+改成^。过了。。。早上真的学的太不顺利了。写了KMMLE。很认真找bug找了差不多一小时。继续MLE。。

○| ̄|_○| ̄|_○| ̄|_

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
    int x=0;
    char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)){
        x=x*10+c-'0';
        c=getchar();
    }
    return x;
}
const int nmax=1005;
vector<int>f[nmax*2];
int v[nmax*2],s[nmax*2],c,n,m;
void add(int a,int va,int b,int vb){
    a=a*2+va;
    b=b*2+vb;
    f[a].push_back(b);
}
bool dfs(int x){
    if(v[x^1]) return false;   //就是这里就是这里!!!!!!!
    if(v[x]) return true;
    v[x]=1;
    s[c++]=x;
    for(int i=0;i<f[x].size();i++){
        if(!dfs(f[x][i]))
          return false;
    }
    return true;
}
bool solve(){
    for(int i=0;i<2*n;i+=2)
        if(!v[i]&&!v[i+1]){
            c=0;
            if(!dfs(i)){
                while(c>0)
                    v[s[--c]]=0;
                if(!dfs(i+1))
                     return false;
            }
            
        }
    return true;
}
void init(){
    for(int i=0;i<2*n;i++)
      f[i].clear();
    clr(v,0);
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        init();
        rep(i,m){
            int a=read(),b=read(),va=read(),vb=read();
           add(a,va,b,vb^1);
           add(b,vb,a,va^1);
        }
         //printf(solve()?"YES\n":"NO\n");
         printf("%s\n",solve()?"YES":"NO"); 
    }
    return 0;
}

 poj3905:ps:还是模板题

没错我又作死成功了没错没错。。。一直写的读入优化都没有遇到过负数的,然后这次就遇到了。于是我找找找,草read()怎么可能会有问题。跳过。看了好几遍之后才不得不看了下read()。不知道说些什么囧囧囧。加边这种写法更加简单一些。

#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x));
int read(){
    int x=0;int f=1;
    char c=getchar();
    while(!isdigit(c)) {
        if(c=='-')           //这里这里这里!!!!
          f=-1;
        c=getchar();
    }
    while(isdigit(c)){
        x=x*10+c-'0';
        c=getchar();
    }
    return f*x;
}
const int nmax=1005;
vector<int>f[nmax*2];
int v[nmax*2],s[nmax*2],n,m,c;
void add(int a,int va,int b,int vb){
    int x=a*2+va;
    int y=b*2+vb;
    f[x^1].push_back(y);
    f[y^1].push_back(x);              //这样子写简单了点!!!
}
bool dfs(int x){
    if(v[x^1]) return false;
    if(v[x]) return true;
    v[x]=1;
    s[c++]=x;
    for(int i=0;i<f[x].size();i++){
        if(!dfs(f[x][i]))
          return false;
    }
    return true;
}
bool solve(){
    for(int i=0;i<2*n;i+=2){
        if(!v[i]&&!v[i+1]){
            c=0;
            if(!dfs(i)){
                while(c>0) v[s[--c]]=0;
                if(!dfs(i+1))
                  return false;
            }
        }
    }
    return true;
}
void init(){
    for(int i=0;i<2*n;i++)
      f[i].clear();
    clr(v,0);
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        init();
        rep(i,m){
            int u=read(),v=read();
            add(abs(u)-1,u<0?1:0,abs(v)-1,v<0?1:0);
        }
        printf("%d\n",solve()?1:0);
    }
    return 0;
}