结尾无空行
输入样例2:
5
1 4
2 1 4
2 2 5
1 3
0
输出样例2:
0
=====================================================================
这个题把入度直接给你了,省得去求了,即第一列就是按顺序的某个结点的入度,如果有环的话肯定会有结点的入度不会为0;
===================================================================
//拓扑排序 如果存在环则不能输出正常序列
#include<stdio.h>
void topology(int N){
int i,j,k,m,b[105],count=0;
int Indegree[105]={0};//入度初始化为0
int Queue[105],head=0,last=0;
int c[105][105];//创建二维数组 将有到达这个顶点的 顶点存进去
for(i = 1; i<=N; i++){
scanf(“%d”,&k);
Indegree[i] = k;//将其入度存进去了
for(j=0; j<k; j++){
scanf(“%d”,&c[i][j]);
}
}
for(i = 1; i<=N; i++){
if(Indegree[i] == 0)
Queue[last++]=i;
}
while(head - last){
m = Queue[head++];//出队 将入度为0的出队
count++;
//顶点度数开始减一 为0 入队
for(i=1; i<=N; i++){
for(j=0; j<105; j++){
if(c[i][j] == m){
Indegree[i]–;
if(Indegree[i] == 0)
Queue[last++] = i;
}
}
}
}
if(count == N ){
printf(“1”);
}
else
printf(“0”);
}
int main(){
int N;
scanf(“%d”,&N);
topology(N);
}
====================================================================
如果兄弟们觉得这道题入度给了,自己不用求,觉得不过瘾的话,我这还有码,是求拓扑序列,当然也能判断是否有环和无环
/*
AOV网(Activity On Vertex Network)【顶点——表示活动】
是一个——有向无回路的图
顶点——表示活动
用弧——表示活动间的优先关系的有向图称为-顶点表示活动的网
即如果a->b,那么a是b的先决条件
求拓扑序列就是AOV
用邻接矩阵存储时 每一列表示这个顶点的入度(有向图中)
*/
#include<bits/stdc++.h>
using namespace std;
typedef struct GNode* PtrGraph;
typedef struct GNode{
int Nv;
int Ne;
int Date[100][100];
}gnode;
int cnt; //统计每个结点的入度
vectorv;//存入度的
vectorv1;//记录拓扑序列
//创建图
void creatrGraph(PtrGraph G){
int N,M;
cin >> N >> M;
G->Nv = N;
G->Ne = M;
//矩阵初始化
for( int i = 0; i < G->Nv; i++ ){
for(int j = 0; j < G->Nv; j++ ){
G->Date[i][j] = 0;
}
}
//矩阵赋值
for(int i = 0; i < G->Ne; i++ )
{
int a,b;
cin >> a >> b;
G->Date[a][b] = 1;//有向图
}
}
//求取每一列的数据和即为该顶点的入度
void degree(PtrGraph G){
for(int j = 0; j < G->Nv; j++ ){
cnt = 0;
for( int i = 0; i < G->Nv; i++ ){
if(G->Date[i][j] == 1)
cnt++;
}
v.push_back(cnt);
}
}
//求拓扑序列
void topology( PtrGraph G ){
queueq;
int count = 0;//用于计算度数为0的结点的个数
for( int i = 0; i < G->Nv; i++ )
{
if(v[i] == 0)
q.push(i);//将入度为0的入队
}
//这里就是处理每次去掉一个度数为0的点和其有关系的顶点度数减一
while( !q.empty() ){
int temp = q.front();
q.pop();
v1.push_back(temp);
count++;
for( int j = 0; j < G->Nv; j++ ){//列
if( G->Date[temp][j] == 1 ){//在 temp 这一行中 等于 1的 j 需要入度减一
v[j]–;//其入度减一