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

方法不同,效率真是天差地别啊

Posted by 15211160230 at 2016-08-29 17:17:14 on Problem 3660
贴上第一份代码,232K	219MS
没有优化,使用效率极低的方法:DFS+BFS
#include <stdio.h>
#include <queue>
#include <memory.h>
#define MAXN 101
int headlist[MAXN],vexnum;
using namespace std;
typedef struct
{	int start,end,next;
}Edge;
Edge de[4501];
int visited[MAXN];
bool flag[MAXN];
bool DFS(int k,int d)
{	if(k==d)	return true;
	visited[k]=1;
	for(int i=headlist[k];i!=-1;i=de[i].next)
		if(!visited[de[i].end]&&DFS(de[i].end,d))
			return true;
	return false;
}
int BFS(int k)
{	queue<int>q;
	int sum=-1,temp,i;
	visited[k]=1;
	q.push(k);
	while(!q.empty())
	{	temp=q.front();
		sum++;
		q.pop();
		for(i=headlist[temp];i!=-1;i=de[i].next)
		{	if(!visited[de[i].end])
			{	visited[de[i].end]=1;
				q.push(de[i].end);
			}
		}
	}
	return sum;
}
int main()
{	int N,M,i,j,ans,temp,len;
	while(scanf("%d %d",&N,&M)!=EOF)
	{	vexnum=N;
		memset(headlist,-1,sizeof(headlist));
		for(i=0;i<M;++i)
		{	scanf("%d %d",&de[i].start,&de[i].end);
			de[i].next=headlist[de[i].start];
			headlist[de[i].start]=i;			
		}
		ans=0;
		for(i=1;i<=vexnum;++i)
		{	len=0;
			for(j=1;j<=vexnum;++j)
			{	memset(visited,0,sizeof(visited));
				if(i!=j&&DFS(j,i)==true)
					len++;
			}
			memset(visited,0,sizeof(visited));
			if(len+BFS(i)==vexnum-1)
				ans++;	
		}
		printf("%d\n",ans);		
	}
	return 0;
}

第二份:204K	0MS
#include <stdio.h>
#include <memory.h>
#define MAXN 101
#define INF 0x3f3f3f3f
int dis[MAXN][MAXN],vexnum;
void Floyd()
{	int i,j,k;
	for(k=1;k<=vexnum;++k)
	{	for(i=1;i<=vexnum;++i)
		{	if(dis[i][k]==INF)	continue;
			for(j=1;j<=vexnum;++j)
			{	if(dis[k][j]==INF)	continue;
				if(dis[i][j]>dis[i][k]+dis[k][j])
					dis[i][j]=dis[i][k]+dis[k][j];
			}
		}
	}
	int ans=0,num;
	for(i=1;i<=vexnum;++i)
	{	num=0;
		for(j=1;j<=vexnum;++j)
		{	if(dis[i][j]!=INF&&i!=j)	num++;
			if(dis[j][i]!=INF&&i!=j)	num++;	
		}
		if(num==vexnum-1)		ans++;
	}
	printf("%d\n",ans);	
}
int main()
{	int N,M,a,b;
	while(scanf("%d %d",&N,&M)!=EOF)
	{	vexnum=N;
		memset(dis,INF,sizeof(dis));
		while(M--)
		{	scanf("%d %d",&a,&b);
			dis[a][b]=1;
		}
		Floyd();
	}
	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