T、DZ 2023-05-11 16:57 采纳率: 83.3%
浏览 243
已结题

PTA 7-2 任务拓扑排序

7-2 任务拓扑排序
一个工程被分解成n个子任务,编号为0至n-1。要完成整个工程需要完成所有的子任务。其中一些子任务必须先于另外一些子任务被完成。给定各子任务之间的先后关系,请编写程序给出一个合理的任务完成顺序,若工程不可行,程序亦能识别。

输入格式:
输入第一行为两个整数n和e,均不超过100。n表示子任务数。接下来e行,表示已知的两个子任务间的先后关系,每行为两个整数a和b,表示任务a必须先于任务b完成。

输出格式:
若工程不可行(一些子任务以自己为先决条件),输出“unworkable project”;若工程可行,输出为1行整数,每个整数后一个空格,为n个子任务的编号,表示子任务的完成顺序,如果有多种可能的顺序,则输出字典序最小者。

注:字典序,即对象在字典中的顺序。对于两个数字序列,从第一个数字开始比较,当某一个位置的数字不同时,该位置数字较小的序列,字典序较小,例如1 2 3 9比1 2 4 5小,1 2 8 9比1 2 10 3小。

输入样例1:
3 2
0 1
1 2
输出样例1:
0 1 2
输入样例2:
3 3
0 1
1 2
2 0
输出样例2:
unworkable project
评测详情
测试点 内存(KB) 用时(ms) 结果 得分
0 444 6 答案错误 0/6
样例都能过,就测试点过不去,有没有大神教一下。

#include <iostream>
#include <stdio.h>
#include <cstdlib>

using namespace std;

#define MVNum 101
#define OK 1
#define ERROR 0
typedef struct Edge
{
    int end;
    struct Edge *next;
}Edge;
Edge *head[MVNum];
int degree[MVNum];
int Q[MVNum];
int top[MVNum];
int vexnum,arcnum;
void init()
{
    for(int i=0;i<vexnum;i++)
        head[i]=NULL;
}
int tpsort()
{
    int i,v,k=0;
    int front=0,rear=0;
    Edge *p;
    for(i=0;i<vexnum;i++)
    {
        if(degree[i]==0)
            Q[rear++]=i;
    }
    while(front<rear)
    {
        v=Q[front++];
        k++;
        for(p=head[v];p!=NULL;p=p->next)
        {
            degree[p->end]--;
            if(degree[p->end]==0)
            {
                Q[rear++]=p->end;
            }
        }
    }
    if(k==vexnum)
        return OK;
    return ERROR;
}
int sort(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int main()
{
    int i,v1,v2;
    cin>>vexnum>>arcnum;
    for(i=0;i<arcnum;i++)
    {
        cin>>v1>>v2;
        degree[v2]++;
        Edge *p=new Edge;
        p->end=v2;
        p->next=head[v1];
        head[v1]=p;
    }
    if(tpsort())
    {
        qsort(Q,vexnum,sizeof(int),sort);
        for(i=0;i<vexnum;i++)
        cout<<Q[i]<<" ";
    }
    else cout<<"unworkable project";
    return 0;
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-11 18:44
    关注
    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7722867
    • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 算法思想

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月12日
  • 已采纳回答 6月4日
  • 创建了问题 5月11日

悬赏问题

  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!