社区讨论
只过了一个,剩下都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 条回复,欢迎继续交流。
正在加载回复...