拓扑排序
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int N=10;
int main(){
int v,e,s,t;
printf("顶点数: ");
scanf("%d",&v); //输入v--顶点数
printf("边数: ");
scanf("%d",&e);//输入边数
vector<int>edge[N];
int line[N]={0};//每个顶点的入度数
//邻接表存边
for(int i = 0 ; i < e ; i++){
printf("边:");
scanf("%d %d",&s,&t); //s-->t
edge[s].push_back(t); //令edge[s]增加t这个结点
line[t]++; //t的入度+1
}
//将入度为0的入队
queue<int>q;
for(int i = 1; i <= v ; i++){
if( line[i] == 0){
q.push(i);
}
}
//开始拓扑排序
printf("拓扑排序: ");
while(!q.empty()){
int ans = q.front();
printf("%d ",ans); //将入度为0的输出并出队
q.pop();
for(int i = 0; i < edge[ans].size() ; i++ ){
int temp = edge[ans][i]; //令出队顶点所连接的边 消失
line[temp]--; //让出队顶点所连的点 的入度数-1
if(line[temp] == 0){ //如果此时入度为0,则入队。
q.push(temp);
}
}
}
return 0;
}