社区讨论

只过了一个,剩下都WA......

P5318【深基18.例3】查找文献参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo91czbs
此快照首次捕获于
2023/10/28 03:58
2 年前
此快照最后确认于
2023/10/28 03:58
2 年前
查看原帖
C
#include<stdio.h>
#include<stdlib.h>
typedef struct EDGE
{
	int ed;
	struct EDGE*next;
}Node;//邻接表节点。 
int queue[100005]={0};//bfs队列。 
int book[100005]={0};//标记数组。 
Node*head[100005];//邻接表的点头节点。 
Node*findmed(Node*head);//寻找中间节点。 
Node*sort(Node*head);//链表排序。 
Node*merge(Node*a,Node*b);//有序链表合并。 
void dfs(int n);
int main()
{int i=0,n=0,m=0,ed=0,st=0,qtail=-1,qhead=0;
Node*trans=NULL;
Node*pr=NULL;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++){head[i]=NULL;}
for(i=0;i<m;i++)//读入。 
{
	scanf("%d %d",&st,&ed);
	ed--;
	st--;
	Node*p=(Node*)malloc(sizeof(Node));
	p->ed=ed;
	p->next=head[st];
	head[st]=p;
}
for(i=0;i<n;i++){head[i]=sort(head[i]);}//排序。 
dfs(0);
printf("\n");
qtail++;//bfs 
queue[qtail]=0;
for(i=0;i<n;i++){book[i]=0;}
book[0]++;
while(qhead<=qtail)
{
	trans=head[qhead];
	printf("%d ",1+qhead);
	while(trans!=NULL)
	{
		if(book[trans->ed]==0)
		{
			qtail++;
			queue[qtail]=trans->ed;
			book[trans->ed]++;
		}
		trans=trans->next;
	}
	qhead++;
}
return 0;
}
void dfs(int n)
{
	Node*trans=head[n];
	book[n]++;
	printf("%d ",1+n);
	while(trans!=NULL)
	{
		if(book[trans->ed]==0){dfs(trans->ed);}
		trans=trans->next;
	}
}
Node*findmed(Node*head)
{
	Node*slow=head;
	Node*fast=head;
	if(head==NULL){return NULL;}
	while(fast->next!=NULL&&fast->next->next!=NULL)
	{
		slow=slow->next;
		fast=fast->next->next;
	}
	return slow;
}
Node*merge(Node*a,Node*b)
{
	Node*pa=a;
	Node*pb=b;
	Node*head=(Node*)malloc(sizeof(Node));
	head->next=NULL;
	Node*trans=head;
	Node*phead=head;
	while(1)
	{
		if(pa==NULL)
		{
			trans->next=pb;
			break;
		}
		else if(pb==NULL)
		{
			trans->next=pa;
			break;
		}
		else
		{
			if(pa->ed<=pb->ed)
			{
				Node*p=pa;
				pa=pa->next;
				p->next=NULL;
				trans->next=p;
				trans=p;
			}
			else
			{
				Node*p=pb;
				pb=pb->next;
				p->next=NULL;
				trans->next=p;
				trans=p;
			}
		}
	}
	head=head->next;
	free(phead);
	return head;
}
Node*sort(Node*head)
{
	if(head==NULL||head->next==NULL){return head;}
	Node*prmed=findmed(head);
	Node*med=prmed->next;
	prmed->next=NULL;
	head=sort(head);
	med=sort(med);
	return merge(head,med);
}

回复

0 条回复,欢迎继续交流。

正在加载回复...