拓扑排序(链式前向星+邻接表)
拓扑排序是一种已知各个量之间的大小关系,然后进行排序的排序方法;
拓扑排序的原理是记录每个节点的入度,然后找到入度为0的节点,输出。之后将与该节点连接的所有节点的入度-1,再重复以上步骤。
例如,给出数据
点1>点2
点2>点3
点4>点3
注:如果出度都为0,那么输出节点较小的点。
链式前向星法:
#include<bits/stdc++.h>
using namespace std;
int head[100100];//节点数组,里面存储下一个
int cnt=0;
struct node{
int to,val,next;
};
node edge[200000];
int ans[100100];
int vis[100100];
int indeg[100100];
void add_edge( int from,int val,int to){
edge[++cnt].val=val;
edge[cnt].to=to;
edge[cnt].next=head[from];
head[from]=cnt;
}
int main(){
int m,n;
while(~scanf("%d%d",&n,&m)){
memset(head,0,sizeof(head));
memset(edge,0,sizeof(edge));
memset(ans,0,sizeof(ans));
memset(vis,0,sizeof(vis));
memset(indeg,0,sizeof(indeg));
int Count=0;
for( int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,0,b);
indeg[b]++;
}
for( int j=1;j<=n;j++)
for( int i=1;i<=n;i++){
if(indeg[i]==0&&vis[i]==0){
ans[++Count]=i;
int now=head[i];
vis[i]=1;
while(now!=0){
indeg[edge[now].to]--;
now=edge[now].next;
}
break;
}
}
for( int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
}
邻接表法:
#include<bits/stdc++.h>
using namespace std;
vector<int>head[100100];
int indegree[100100];
int vis[100100];
int ans[100100];
int main(){
int n,m;//n代表元素个数 ,m代表要求个数
while(~scanf("%d%d",&n,&m)){
memset(vis,0,sizeof(vis));
memset(indegree,0,sizeof(indegree));
for( int i=1;i<=n;i++){
head[i].clear();
}
for( int i=1;i<=m;i++){
int from,to;
cin>>from>>to;
head[from].push_back(to);
indegree[to]++;
}
int cnt=0;//维护答案的指针
for( int i=1;i<=n;i++){
for( int j=1;j<=n;j++){
if(vis[j]==0&&indegree[j]==0){
ans[++cnt]=j;
vis[j]=1;
for( int p=0;p<head[j].size();p++){
indegree[head[j][p]]--;
}
break;
}
}
}
for( int i=1;i<=n;i++){
cout<<ans[i];
if(i!=n) cout<<" ";
}
cout<<endl;
}
}