现在的位置: 首页 > 综合 > 正文

pku 1041 John’s trip

2013年02月02日 ⁄ 综合 ⁄ 共 2447字 ⁄ 字号 评论关闭
View Code

#include <iostream>   
#include
<cstring>
#include
<algorithm>
using namespace std;
const int maxnode = 50;
const int maxedge = 2000;
struct edge
{
int start;
int end;
};
edge ArrayEdge[maxedge];
int degree[maxnode];
int start;
int NodeNum, EdgeNum;
int anStack[maxedge], pIndex;
int visited[maxedge];
bool Judge()
{
for(int i=1; i<=NodeNum; ++i)
{
if(degree[i]&1 != 0)
{
return false;
}
}
return true;
}
void euler(int s)
{
for(int i=1; i<=EdgeNum; ++i)
{
if(!visited[i] && (ArrayEdge[i].start==s || ArrayEdge[i].end==s))
{
visited[i]
= 1;
euler(ArrayEdge[i].start
+ ArrayEdge[i].end - s);
anStack[pIndex
++] = i;
}
}
}

int main()
{
int x, y, z;
while(cin>>x>>y && (x!=0 || y!=0))
{
NodeNum
= 0;
EdgeNum
= 0;
memset(degree,
0, sizeof(degree));
memset(visited,
0, sizeof(visited));
pIndex
= 0;
start
= min(x, y);
do
{
cin
>>z;
ArrayEdge[z].start
= x;
ArrayEdge[z].end
= y;
degree[x]
++;
degree[y]
++;
EdgeNum
++;
NodeNum
= max(NodeNum, max(x, y));
}
while(cin>>x>>y && (x!=0 || y!=0));
if(!Judge())
cout
<<"Round trip does not exist."<<endl;
else
{
euler(start);
for(int i=EdgeNum-1; i>=1; --i)
{
cout
<<anStack[i]<<" ";
}
cout
<<anStack[0]<<endl;
}
}
return 0;
}

第一次用用邻接表存储一个图,唉,说起来,自己也太不灵活了,题目要求输出的是边,可是我用邻接表存储的是每一个节点,这样不仅耗内存,而且慢了好多。

算了,也挺安慰的,没什么大的错误,就是用邻接表的时候指针指得有点晕了,很乱;

不过,额,该骂一下自己,题目都没看清楚,明明已经说了是连通图了,我还用并查集判断了一遍,不过已经删了

有俩个代码,效率差不了多少,就是开内存上的差距太大了,十倍左右

#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int d[45],n,m,s[2000],l;
bool vis[2000];
typedef struct edge
{
	int x,num;
	edge *next1;
}e,*e1;
struct node
{
	e1 next2;
}nod[45];
void init()
{
	memset(d,0,sizeof(d));
	for(int i=0;i<=44;i++)
		nod[i].next2=NULL;
}
void insert(int v,int w,int t)
{
	e1 root=nod[v].next2,p1,p2;
	if(root->next1==NULL)
	{	
		root->next1=(e1)malloc(sizeof(e));
		root->next1->num=t;
		root->next1->x=w;
		root->next1->next1=NULL;
	}
	else 
	{
		p1=(e1)malloc(sizeof(e));
		p1->num=t;p1->x=w;p1->next1=NULL;
		e1 p=root->next1;p2=root;
		int flag=0;
		for( ;p!=NULL;p=p->next1)
		{
			if(p->num>t)//这里做了很多余的一件事
			{
				p2->next1=p1;
				p1->next1=p;
				flag=1;
				break;
			}
			p2=p;
		}
		if(!flag) p2->next1=p1;
	}
}
void dfs(int v)
{
	e1 p=nod[v].next2->next1;
	for(;p;p=p->next1)
	{
		if(!vis[p->num])
		{
			vis[p->num]=1;
			dfs(p->x);
			s[l++]=p->num;
		}
	}
}
int main()
{
	int t;
	while(cin>>n>>m&&(n||m))
	{
		init();
		while(n||m)
		{
			cin>>t;
			if(nod[n].next2==NULL)
			{
				nod[n].next2=(e1)malloc(sizeof(e)); 
				nod[n].next2->next1=NULL;
			}
			if(nod[m].next2==NULL)
			{
				nod[m].next2=(e1)malloc(sizeof(e));
				nod[m].next2->next1=NULL;
			}
		
			insert(n,m,t);	
			insert(m,n,t);
			d[n]++;d[m]++;
			cin>>n>>m;
		}
		int flag=1;
		for(int i=1;i<45;i++)
		{
			if(d[i]&&d[i]%2!=0)
			{
				flag=0;
				break;
			}
		}
		if(flag)
		{
			memset(vis,0,sizeof(vis));
			l=0;
			dfs(1);
			for(int i=l-1;i>=0;i--)
				cout<<s[i]<<' ';
			cout<<endl;
			continue;
		}
		else cout<<"Round trip does not exist."<<endl;
	}
	return 0;
}

抱歉!评论已关闭.