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();
}
}