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

这个代码在3177能过...为什么在这题就过不了呢

Posted by hutu_2000 at 2009-08-14 14:52:43 on Problem 3352
#include <iostream>
using namespace std;
#define M 10005
#define N 5005
struct enode
{
	int b,next;
};
enode map[M];
struct vnode
{
	int anc,deep,next;
};
vnode v[N];
int n;

int belongs[N];            //记录每个节点对应的标号...
pair<int,int> bridges[N];                 //记录所有桥...
int ll;            //记录桥的个数...
int root[N];               //记录根节点..
int color[N];      //记录点的状态。==-1,则说明没被扫描,==0表示正在扫描.. ==1表示已经扫描完了...
//因为出现圈的情况是扫描到color[]==0的点(其最高祖先节点比其父节点高..)

void solve();
void dfs(int k,int father,int d);              //k表示当前节点,father表示k的父亲节点,d表示当前节点的深度...
//可以确定每个节点属于哪个集合...还有,哪些表示是桥...(并查集)
int roots(int x);
void unit(int x,int y);

int main()
{
	int m,l=0,i,x,y;
	scanf("%d %d",&n,&m);
	memset(v,-1,sizeof(v));
	for(i=0;i<m;i++)
	{
		scanf("%d %d",&x,&y);
		map[l].b=y;
		map[l].next=v[x].next;
		v[x].next=l++;

		map[l].b=x;
		map[l].next=v[y].next;
		v[y].next=l++;
	}
	solve();
	return 0;
}


void solve()
{
	memset(color,-1,sizeof(color));
	int i,ras=0;
	for(i=1;i<=n;i++)
		root[i]=i;
	dfs(1,1,1);
	memset(belongs,-1,sizeof(belongs));
	for(i=1;i<=n;i++)
	{
		int d=roots(i);
		if(belongs[d]==-1)
			belongs[d]=++ras;
		belongs[i]=belongs[d];
	}
	int dex[N],count=0;                 //记录每个点的度数...   记录度数为0的点的个数...
	memset(dex,0,sizeof(dex));                 
	for(i=0;i<ll;i++)
	{
		int a=belongs[bridges[i].first],b=belongs[bridges[i].second];
		dex[a]++;
		dex[b]++;
	}
	for(i=1;i<=ras;i++)
		if(dex[i]==1) count++;               //***
	printf("%d\n",(count+1)/2);
}

void dfs(int k,int father,int d)           //确定双连通点的集合,找出桥...           返回子树中中的最高祖先...
{
	v[k].deep=d;
	v[k].anc=d;
	color[k]=0;
	//cout<<k<<"   "<<father<<"   "<<d<<endl;
	for(int i=v[k].next;i!=-1;i=map[i].next)
	{
		int y=map[i].b;
		if(color[y]==-1)
		{
			dfs(y,k,d+1);
			if(v[k].anc>=v[y].anc)            //(k,y)不是桥,则k,y必然属于同一个缩点...
				v[k].anc=v[y].anc,unit(k,y);
			else                              //反之,(k,y)是桥,记录桥...
				bridges[ll].first=k,bridges[ll++].second=y; 
		}
		else if(color[y]==0&&y!=father)
			v[k].anc=v[y].deep;                  //???	
	}
	color[k]=1;
}

int roots(int x)
{
	if(x!=root[x])
		root[x]=roots(root[x]);
	return root[x];
}

void unit(int x,int y)
{
	int a=roots(x),b=roots(y);
	if(a!=b) root[a]=b;
}

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