求一段c语言代码,题目:建立图的存储结构,能够输入图的顶点和边的信息,并存储到相应存储结构中
基本要求:选择邻接表作为有向图的存储结构模拟整个过程,并输出拓扑排序的顶点序列 展开
/*输入:先输入两个数,代表点的数量和边的数量,
再输入各个边,起点编号 > 终点编号,编号从0开始
例子:
6 10
0 3
0 4
1 4
1 3
3 5
0 1
4 5
5 2
4 2
4 3
输出:
0 1 4 3 5 2
思路:
用vector建立邻接表
计算每个点的入度
如果是偏序无环的,一定存在入度为0的点,输出并且删除它,同时删除它出发的边,更新其他点的入度
循环直到移除所有点,输出顺序就是拓扑排序
*/
#include<iostream>
#include<vector>
using namespace std;
int main() {
freopen("in.txt","r",stdin);//重定向输入流//in.txt 建在程序所在的文件夹里
int M,N;
scanf("%d%d",&M,&N);//M个点,N条边
vector<int> maps[M];
int innode[M]={0};//入度
for(int i=0;i<N;i++)
{
int tx,ty;
scanf("%d%d",&tx,&ty);
maps[tx].push_back(ty);
++innode[ty];
}
for(int time=0;time<M;time++)
for(int i=0;i<M;i++)
{
if(innode[i]==0)
{
printf("%d ",i);
for(vector<int>::iterator it = maps[i].begin(); it != maps[i].end(); ++it)
{
--innode[*it];
}
innode[i]=-1;
break;
}
}
}
2023-08-15 广告