Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

无偿贴出rank2代码

Posted by HTA at 2013-01-23 16:04:45 on Problem 3678
/*
ID:huangta3
PROG:
LANG:C++
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <list>
#include <queue>
#include <vector>
#include <ctime>
#include <set>
#include <bitset>
#include <deque>
#include <fstream>
#include <stack>
#include <map>
#include <utility>
#include <cassert>
#include <string>
#include <iterator>
#include <cctype>
using namespace std;
const int maxn=2003;
const int maxm=4000003;
int n,m,tot=0,N,Link[maxn],pre[maxm],t[maxm],dfn[maxn],low[maxn],stk[maxn],vis[maxn],belong[maxn],top=0,ind=0;
int get()
{
    int f=0,v=0;char ch;
    while(!isdigit(ch=getchar()))if(ch=='-')break;
    if(ch=='-')f=1;else v=ch-48;
    while(isdigit(ch=getchar()))v=v*10+ch-48;
    if(f==1)return -v;else return v;
}

int op(int x)
{
    if(x<=n)return x+n;else return x-n;
}

void add(int x,int y)
{
    pre[++tot]=Link[x]; Link[x]=tot; t[tot]=y;
}

void init()
{
    n=get(),m=get();
    for(int i=1;i<=m;i++)
    {
        int x=get(),y=get(),z=get();
        char ch; x++,y++;
        while(!isalpha(ch=getchar()));
        if(ch=='A'&&z==0)add(x,op(y)),add(y,op(x));
        if(ch=='A'&&z==1)add(op(x),x),add(op(y),y);
        if(ch=='O'&&z==0)add(x,op(x)),add(y,op(y));
        if(ch=='O'&&z==1)add(op(x),y),add(op(y),x);
        if(ch=='X'&&z==0)add(x,y),add(y,x),add(op(x),op(y)),add(op(y),op(x));
        if(ch=='X'&&z==1)add(x,op(y)),add(op(x),y),add(y,op(x)),add(op(y),x);
    }
}

void tarjan(int x)
{
    dfn[x]=low[x]=++ind;
    vis[x]=1; stk[++top]=x;
    for(int i=Link[x];i>0;i=pre[i])
    {
        if(vis[t[i]]==0)
        {
            tarjan(t[i]);
            low[x]=min(low[x],low[t[i]]);
        }else if(vis[t[i]]==1)low[x]=min(low[x],low[t[i]]);
    }
    if(dfn[x]==low[x])
    {
        N++;
        while(stk[top]!=x)belong[stk[top]]=N,vis[stk[top--]]=2;
        belong[stk[top]]=N,vis[stk[top--]]=2;
    }
}

void work()
{
    N=0;
    for(int i=1;i<=n+n;i++)
        if(vis[i]==0)tarjan(i);
    for(int i=1;i<=n;i++)
        if(belong[i]==belong[op(i)]){puts("NO");return;}
    puts("YES");
}

int main()
{
    init();
    work();
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator