来自 链表-邻接表 的求助!
查看原帖
来自 链表-邻接表 的求助!
363491
U_92_Uranium楼主2021/8/27 08:17

题解中的 vector AC没问题,但是链表哪里错了?

思路是这样的:先把每组边的起点终点存下来,进行排序(先按起点从小到大排序,再按终点从大大小排序,因为是“头插法”先插的在最后)最后用Insert函数建立邻接表,分别DFS和BFS。

样例: 函数都是手写的,大佬可以忽略掉;

qsort()相当于sort()只不过加了char uv参数判断对第几关键字排序;

Insert()是头插法

代码:

/*    链表实现    */ 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <utility>
using namespace std;
const int maxn=1e5+5,maxm=1e6+5;
int n,m,book[maxm],que[maxm],Front=0,Back=0;
bool flag;
struct NODE {
    int u;
    int v;
    NODE *next;
} a[maxm];
struct LIST {
    int num;
    NODE *head;
} g[maxn];
void qsort(int L,int R,char uv)
{
    int i=L,j=R;
    NODE mid=a[(L+R)/2];
    if(uv=='u') {
        do {
            while(a[i].u<mid.u) {
                i++;
            }
            while(a[j].u>mid.u) {
                j--;
            }
            if(i<=j) {
                swap(a[i],a[j]);
                i++;
                j--;
            }
        } while(i<=j);
        if(L<j) {
            qsort(L,j,uv);
        }
        if(i<R) {
            qsort(i,R,uv);
        }
        return;
    } else {
        do {
            while(a[i].v>mid.v) {
                i++;
            }
            while(a[j].v<mid.v) {
                j--;
            }
            if(i<=j) {
                if(a[i].u==a[j].u) {    //注意!第二遍排序是在u相等的基础上对v排序,
                    swap(a[i],a[j]);
                }
                i++;
                j--;
            }
        } while(i<=j);
        if(L<j) {
            qsort(L,j,uv);
        }
        if(i<R) {
            qsort(i,R,uv);
        }
        return;
    }
    return;
}
void Insert(int u,int v)
{
    NODE *p=new NODE;
    p->v=v;
    p->next=g[u].head;
    g[u].head=p;
    return;
}
void DFS(int u)
{
    if(flag==true) {
        printf("%d",u);
        flag=false;
    } else {
        printf(" %d",u);
    }
    book[u]=1;
    NODE *p=g[u].head;
    while(p!=NULL) {
        if(book[p->v]==0) {
            DFS(p->v);
        }
        p=p->next;
    }
    return;
}
void BFS(int u)
{
    printf("%d",u);
    que[Back++]=u;
    book[u]=1;
    while(Front<Back) {
        NODE *p=g[que[Front]].head;
        while(p!=NULL) {
            if(book[p->v]==0) {
                printf(" %d",p->v);
                que[Back++]=p->v;
                book[p->v]=1;
            }
            p=p->next;
        }
        Front++;
    }
    return;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++) {
        g[i].num=i;
        g[i].head=NULL;
    }
    for(int i=1; i<=m; i++) {
        scanf("%d%d",&a[i].u,&a[i].v);
        a[i].next=NULL;
    }
    qsort(1,m,'u');
    qsort(1,m,'v');
    for(int i=1; i<=m; i++) {
        Insert(a[i].u,a[i].v);
    }
    flag=true;
    DFS(1);
    printf("\n");
    memset(book,0,sizeof(book));
    BFS(1);
    printf("\n");
    return 0;
}

感谢所有路过的大佬,希望问题早日解决!

2021/8/27 08:17
加载中...