7-34 任务调度的合理性 (25 分)(思路加详解+兄弟们冲呀)(1)

结尾无空行

输入样例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]–;//其入度减一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值