拓扑排序

207. 课程表

今天get到了拓扑排序的写法,本题是拓扑排序+BFS。
①首先题目给的prerequisites令人头疼,如果有一对 [1,4] ,是要先完成4,才能做1,也就是箭头指向1,即1的入度加1,所以存边的时候是以第二个数为edge的一维。
②将入度为0的结点存入队列,当某结点出队时,它的边自然也会消失,它所指向的结点的入度要减一,若该结点的入度减为0,则将该结点入队。
③最后ans若等于结点总数,则存在拓扑排序。
(阿伟还发现C++竟然能用变量定义数组了!!!不过是高级的编译器才可以这么写,为了保险,还是不建议使用的)

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        const int MAX=100001;
        vector<int>edge[MAX];
        int degree[MAX];
        memset(degree,0,sizeof(degree));
        for(int i=0;i<prerequisites.size();i++){
            degree[prerequisites[i][0]]++;
            edge[prerequisites[i][1]].push_back(prerequisites[i][0]);
        }
        queue<int>q;
        for(int i=0;i<numCourses;i++){
            if(degree[i]==0)
                q.push(i);
        }
        int ans=0;
        while(!q.empty()){
            int tmp=q.front();
            q.pop();
            ans++;
            for(int i=0;i<edge[tmp].size();i++){
                degree[edge[tmp][i]]--;
                if(degree[edge[tmp][i]]==0)
                    q.push(edge[tmp][i]);
            }
        }
        if(ans==numCourses)
            return true;
        else
            return false;
    }
};

HDOJ1285 确定比赛名次

本题使用数组ans[][]来存边,使用优先队列priority_queue来存拓扑序列,首先说一下优先队列
和队列基本操作相同:

  • top 访问队头元素——queue是front
  • empty 队列是否为空
  • size 返回队列内元素个数
  • push 插入元素到队尾 (并排序)
  • emplace 原地构造一个元素并插入队列
  • pop 弹出队头元素
  • swap 交换内容
 //对于基础类型 默认是大顶堆
priority_queue<int> a; 
//等同于 priority_queue<int, vector<int>, less<int> > a;
// 这里一定要有空格,不然成了右移运算符↓↓
priority_queue<int, vector<int>, greater<int> > c;  //这样就是小顶堆

本题在做的时候一直WA,后来看了大佬的题解,在输入数据的时候要加上

for(int i=0;i<m;i++){
            cin>>a>>b;
            if(!edge[a][b]){//加上这个
                edge[a][b]=1;
                in[b]++;
            }
        }

可能是因为怕有重边,入度多加吧emmm

#include<bits/stdc++.h>
using namespace std;
int n,m;
int edge[501][501];
int in[501];
void tuopu()
{
    priority_queue<int,vector<int>,greater<int> >q;
        //queue<int>q;
        for(int i=1;i<=n;i++){
            if(in[i]==0)
                q.push(i);
        }
        int flag=0;
        while(!q.empty()){
            int tmp=q.top();
            q.pop();
            in[tmp]=-1;
            if(!flag){
                cout<<tmp;
                flag=1;
            }
            else{
                cout<<" "<<tmp;
            }
            for(int i=1;i<=n;i++){
                if(edge[tmp][i]>0){
                    in[i]--;
                    edge[tmp][i]=0;
                    if(in[i]==0)
                        q.push(i);
                }

            }
        }
        cout<<endl;
}
int main()
{
    while(cin>>n>>m){
        memset(in,0,sizeof(in));
        memset(edge,0,sizeof(edge));
        int a,b;
        for(int i=0;i<m;i++){
            cin>>a>>b;
            if(!edge[a][b]){
                edge[a][b]=1;
                in[b]++;
            }
        }
        tuopu();
    }
}
期末大作业基于python的足球运动员数据分析源码+数据集(高分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于pyth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值