0
点赞
收藏
分享

微信扫一扫

22.3.14

Go_Viola 2022-03-14 阅读 9

1,bfs 图中点的层次2,有向拓扑序列;


1,bfs 图中点的层次,

重边:从1指向2有多个边,不是一条边;

自环,从 1指向1;

发现自己不会写邻接表。。。;

那就手写,加理解!!

需要的元素 和链表其实差不太多,都是e[] , ne[] , idx , h[] ;只有h[] 是数组了,而不再是一个单独head结点,当然,这很好理解也,毕竟邻接表看起来就像是一行一行的链表组成的;

可以看出来,idx仍是对每个元素进行给予空间的操作,就是为每一个独立的元素落下脚跟,然后因为有不同的头结点嘛,所以head结点变为h[]数组,储存不同的头结点,然后ne[]指针数组,就指向不同的h[]头结点;遍历的时候,因为新加进来的元素占用过最近的idx,所以每一行从左到右存储的是新元素→旧元素;又因为,ne[]先指向h[],h[]在增加,所以ne[]总是指向h[]的前一个元素;所以遍历h[]的时候就是从新到到旧的遍历顺序;

对h1的遍历;


#include<bits/stdc++.h>
#define rep1(i,a,n) for(int i=a;i<n;i++) 
#define rep2(i,a,n) for(int i=a;i<=n;i++) 
#define per1(i,n,a) for(int i=n;i>a;i--) 
#define per2(i,n,a) for(int i=n;i>=a;i--)
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
void quick_cin()
{
	cin.tie(0);
	ios::sync_with_stdio(false);
}
int n,m;
const int N=1e5+9;
int e[N],ne[N],idx,h[N],d[N];
queue<int>q;
void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int bfs()
{
	d[1]=0;
	q.push(1);
	while(q.size())
	{
		int t=q.front();
		q.pop();
		for(int i=h[t];i!=-1;i=ne[i])
		{
			if(d[e[i]]==-1)
			{
				q.push(e[i]);
				d[e[i]]=d[t]+1;
			}
		}
	}
	return d[n];
}
int main()
{
	quick_cin();
	memset(h,-1,sizeof h);
	memset(d,-1,sizeof d);
	cin>>n>>m;
	rep2(i,1,m)
	{
		int a,b;
		cin>>a>>b;
		add(a,b);
	}
	printf("%d",bfs());
    return 0;
}

对d[]数组的理解,d[]存储第一个结点到第n个节点的最短距离 

用 d 数组保存1号节点到各个节点的距离,初始时,都是无穷大。同时d初始化-1又可以标记该点有没有走过;

①从 1 号节点开始,广度优先遍历:1 号节点入队列,dist[1] 的值更新为 0。

②如果队列非空,就取出队头,找到队头节点能到的所有节点。如果队头节点能到走到的节点没有标记过,就将节点的dist值更新为队头的dist值+1,然后入队。

③重复步骤 2 直到队列为空。

④这个时候,dist数组中就存储了 1 号节点到各个节点的距离了。如果距离是无穷大,则不能到达,输出 -1,如果距离不是无穷大,则能到达,输出距离。

2,拓扑排序

针对有向无环图(DAG Driected Acyclic Graph)

有向无环图一定存在拓扑序列,所以DAG又叫做拓扑图;

拓扑排序和入度出度有关,并且用队列去做;

所有入度为0的点都可以作为起点;

#include<bits/stdc++.h>
#define rep1(i,a,n) for(int i=a;i<n;i++) 
#define rep2(i,a,n) for(int i=a;i<=n;i++) 
#define per1(i,n,a) for(int i=n;i>a;i--) 
#define per2(i,n,a) for(int i=n;i>=a;i--)
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
void quick_cin()
{
	cin.tie(0);
	ios::sync_with_stdio(false);
}
int n,m;
const int N=1e5+9;
int e[N],ne[N],idx,h[N],d[N],ans[N],k;
queue<int>q;
void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool topsort()
{
	rep2(i,1,n)if(!d[i])q.push(i),ans[k++]=i;

	while(q.size())
	{
		int t=q.front();
		q.pop();
		for(int i=h[t];i!=-1;i=ne[i])
		{
			d[e[i]]--;
			if(d[e[i]]==0)q.push(e[i]),ans[k++]=e[i];
		}
	}
	return k==n;
}
int main()
{
	quick_cin();
	memset(h,-1,sizeof h);
	cin>>n>>m;
	rep2(i,1,m)
	{
		int x,y;
		cin>>x>>y;
		add(x,y);
		d[y]++;
	}
	if(topsort())
	{
		rep2(i,0,k-1)printf("%d ",ans[i]);
	}
	else printf("-1");
    return 0;
}
举报
0 条评论