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

这题真变态 ,非递归 DFS 的 O(V) 算法也超时!大牛帮瞧瞧!!

Posted by windyrobin at 2008-08-06 17:39:57 on Problem 1655
#include <iostream>
#include <queue>
#include <stack>
using namespace std;

const int MAXV = 20000;

typedef struct _linkGraph{
	int pos;
	_linkGraph *next;
}LinkGraph;

typedef struct {
	int parentIndex;
	int vCount;
	LinkGraph *adj;
	bool visited;
}GraphRow;

GraphRow Graph[MAXV+1];

void initGraph(int v)
{
	for(int i=1 ;i<=v ;i++){
		Graph[i].vCount=1;
		Graph[i].adj=NULL;
		Graph[i].visited=false;
		Graph[i].parentIndex = 0;
	}
}

inline void addGraph(int sPos ,int dPos)
{
	LinkGraph *nlg=new LinkGraph;
	nlg->pos=dPos;
	nlg->next=Graph[sPos].adj;
	Graph[sPos].adj = nlg ;
}

void clearGraph(int v)
{
	LinkGraph *clg ,*nlg;
	for(int i=1 ;i<=v ;i++){
		clg=Graph[i].adj;
		Graph[i].adj = NULL ;
		while(clg!=NULL){
			nlg=clg->next;
			delete clg;
			clg=nlg;
		}
	}
}

void buildGraph(int v ,int e)
{
	int sPos ,dPos;
	for(int i=0 ;i<e ;i++){
		scanf("%d %d" ,&sPos ,&dPos);
		addGraph(sPos ,dPos);
		addGraph(dPos ,sPos);
	}
}
//bfs recursion,this would tle!!!
int trackVCount(int root)
{
	int count=1;
	LinkGraph *adj=Graph[root].adj;
	Graph[root].visited=true;
	while(adj!=NULL){
		if(false == Graph[adj->pos].visited){
			count += trackVCount(adj->pos);
		}
		adj=adj->next;
	}
	Graph[root].vCount=count;
	return count;
}
//dfs ,non-recursion!!
int dfsCount(int v ,int root)
{
	LinkGraph *adj=NULL;
	stack<int> nodes;


	int curNodeIndex;

	nodes.push(root) ;
	while(!nodes.empty()){
		curNodeIndex = nodes.top();
		if(true == Graph[curNodeIndex].visited){
			Graph[Graph[curNodeIndex].parentIndex].vCount += Graph[curNodeIndex].vCount;
			//printf("node  ,count : %d %d\n" ,curNodeIndex ,Graph[curNodeIndex].vCount) ;
			nodes.pop();
			continue ;
		}//else

		adj=Graph[curNodeIndex].adj ;
		while(adj !=NULL){
			if(false == Graph[adj->pos].visited ){
				nodes.push(adj->pos);
				Graph[adj->pos].parentIndex = curNodeIndex ;
			}
			adj = adj->next ;
		}
		Graph[curNodeIndex].visited = true ;
	}
	return 1;	
}

void printNodes(int v)
{
	int minResult=v;
	int minResultPos=-1;
	LinkGraph *adj;
	int aliVCount;
	bool isNodeOk;
	int curMaxNodes;
	for(int i=1 ;i<=v ;i++){
		if(v-Graph[i].vCount >= minResult)
			continue;
		isNodeOk=true;
		adj=Graph[i].adj;
		curMaxNodes=v-Graph[i].vCount;
		while(adj != NULL){
			aliVCount=Graph[adj->pos].vCount;
			//only consider child  node!!
			if(aliVCount < Graph[i].vCount){
				if(aliVCount >= minResult){
					isNodeOk=false;
					break;
				}else if(aliVCount > curMaxNodes)
					curMaxNodes=aliVCount;
			}
			adj=adj->next;
		}
		if(true == isNodeOk){
			minResult=curMaxNodes;
			minResultPos=i;
		//	printf("%d %d\n" ,i ,curMaxNodes);
		}
	}
	printf("%d %d\n" ,minResultPos ,minResult);
}

int main()
{
	int testcase;
	int v;
	freopen("1655.txt" ,"r" ,stdin);
	scanf("%d" ,&testcase);
	while(testcase-- > 0){
		scanf("%d" ,&v);
		initGraph(v);
		buildGraph(v ,v-1);
		dfsCount(v ,1) ;
	//	trackVCount(1);
		printNodes(v);

		clearGraph(v);
	}
	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