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

不知道为什么WA.和正确程序跑了100多组数据依然一致

Posted by SunnyElemeNt at 2010-05-31 15:04:12 on Problem 2186
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>

#define maxn 10001
#define maxm 50001
using namespace std;

int y[maxm],now[maxn],pre[maxm],tot,LOW[maxn],DFN[maxn],stack[maxn],Belong[maxn],k,Sum;
int outdegree[maxn],step,Cnt,top,N,M;
bool visit[maxn];

void addedge(int from , int to){
     tot++;
     pre[tot] = now[from] ;
     now[from] = tot ;
     y[tot] = to;
}
void tarjan(int u){
     DFN[u] = LOW[u] = ++step ;
     visit[u] = 1;
     stack[++top] = u ;
     for (int mark = now[u] ; mark > 0 ; mark = pre[mark])
        {
            int v = y[mark];
            if (!DFN[v])
                {
                    tarjan(v);
                    LOW[u] = min(LOW[u],LOW[v]);
                }
            else
                {
                    if (visit[v])
                        LOW[u] = min(LOW[u],DFN[v]);
                }
        }
     if (LOW[u] == DFN[u])
        {
            Cnt++;
            int v;
            do
            {
                v = stack[top--];
                Belong[v] = Cnt;
                visit[v] = false;
            }
            while (v!=u);
        }
}
void initialize(){
    scanf("%d%d",&N,&M);
    tot = 0 ;
    for (int i = 1 ; i <= M ; i++)
        {
            int A , B;
            scanf("%d%d",&A,&B);
            addedge(A , B);
        }
    /*for (int i = 1 ; i <= N ; i++)
        {
            for (int mark = now[i] ; mark > 0 ; mark = pre[mark])
                {
                    int j = y[mark];
                    printf("%d ",j);
                }
            printf("\n");
        }*/
    }
void solve(){
    memset(DFN,0,sizeof(DFN));
    memset(visit,false,sizeof(visit));
    step = top = Cnt = 0 ;
    for (int i = 1 ; i <= N ; i++)
        if (!DFN[i])
            tarjan(i);
    memset(outdegree,0,sizeof(outdegree));
    for (int i = 1 ; i <= N ; i++)
        {
            for (int mark = now[i] ; mark > 0 ; mark = pre[mark])
                {
                    int j = y[mark];
                    if (Belong[i]!=Belong[j])
                        outdegree[Belong[i]]++;
                }
        }
    //for (int i = 1 ; i <= N ; i++)
    //    printf("%d\n",Belong[i]);
   // printf("%d\n",Cnt);
    Sum = 0 ;
    for (int i = 1 ; i <= Cnt ; i++)
        if (outdegree[i] == 0)
            {
                    Sum++;
                    k = i ;
            }
   // printf("%d\n",Sum);
    }
void outitialize(){
    if (Sum != 1)
        {
            printf("%d\n",0);
            exit(0);
        }
    int Answer = 0 ;
    for (int i = 1 ; i <= N ; i++)
        if (Belong[i] == Cnt)
            {
                Answer++;
            }
    printf("%d\n",Answer);
    }
int main(){
    //freopen("tmp.in","r",stdin);
    //freopen("tmp1.out","w",stdout);
    int t ;
    t = 1;
    while (t--)
        {
            initialize();
            solve();
            outitialize();
        }
    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