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

第一道强联通,错误bug百出,wa了不下10次,囧,贴代码纪念。

Posted by ccsu2008021220 at 2009-12-08 22:42:40 on Problem 2186
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int Max1=10002;
const int Max2=50002;
struct node{
       int last;
       node*next;
}*Head[Max1],*fHead[Max1];
int connect[Max1];
int E[Max2][2];
int num[Max1];
bool flag[Max1];
int nn;
void add(int a,int b)
{
     node*temp=new node;
     temp->last=b;
     temp->next=Head[a];
     Head[a]=temp;
     node*temp1=new node;
     temp1->last=a;
     temp1->next=fHead[b];
     fHead[b]=temp1;
}
void dfs1(int i)
{
     node*ptr=Head[i];
     flag[i]=1;
     for(;ptr;ptr=ptr->next)
     {
           if(!flag[ptr->last])
               dfs1(ptr->last);
     }
     num[++nn]=i;
}
void dfs2(int i,int nn)
{
     node*ptr=fHead[i];
     flag[i]=0;
     for(;ptr;ptr=ptr->next)
           if(flag[ptr->last])
               dfs2(ptr->last,nn);
     connect[i]=nn;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
         for(int i=1;i<=n;i++) Head[i]=NULL;
         for(int i=1;i<=n;i++) fHead[i]=NULL;
         for(int i=1;i<=m;i++)
         {
                 scanf("%d%d",&E[i][0],&E[i][1]);
                 add(E[i][0],E[i][1]);
         }
         memset(flag,0,sizeof(flag));
         nn=0;
         for(int i=1;i<=n;i++)
                 if(!flag[i])
                     dfs1(i);
         nn=0;
         for(int i=n;i>=1;i--)
                 if(flag[num[i]])
                 {
                       nn++;
                       dfs2(num[i],nn);
                 }
         bool flag1[Max1]={false};
         for(int i=1;i<=m;i++)
             if(!flag1[connect[E[i][0]]]&&connect[E[i][0]]!=connect[E[i][1]])
                   flag1[connect[E[i][0]]]=1;
         int numm=0;
         int temp;
         for(int i=1;i<=n;i++)
            if(!flag1[connect[i]])
            {
               flag1[connect[i]]=1;
               numm++;
               temp=connect[i];
            }
         if(numm!=1) printf("%d\n",0);
         else
         {
             int ans=0;
             for(int i=1;i<=n;i++)
                 if(connect[i]==temp)
                    ans++;
             printf("%d\n",ans);
         }            
    }
    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