hihoCoder #1174 拓扑排序·一
题解:
拓扑排序的裸题,因为题目给的点数和边数最大值比较大,为了节省空间就用邻接表来进行存储。并且用队列来模拟取入度为零的点,并删除以它为尾的边。最后将取点数和n进行比较即可
代码:
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN = 1e5+5;
int n,m;
int indeg[MAXN]; //用于记录入度
vector<int> edge[MAXN]; //邻接表
queue<int> Q;
void init(){
for(int i = 1; i <= n; ++i){
edge[i].clear(); //邻接表的初始化
indeg[i] = 0;
}
while(!Q.empty()) Q.pop();
}
bool topsort(){
int num = 0;
for(int i = 1; i <= n ;++i)
if(!indeg[i])
Q.push(i);
while(!Q.empty()){
int now = Q.front();
Q.pop();
num++;
for(int i = 0; i < edge[now].size(); ++i)
if(--indeg[edge[now][i]] == 0) //删边操作即为入度减一
Q.push(edge[now][i]); //将删边之后无入度的点放入队列中
}
if(num == n) return true;
return false;
}
int main(){
int t,u,v;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
init();
for(int i = 0; i < m; ++i){
scanf("%d%d",&u,&v);
edge[u].push_back(v);
indeg[v]++;
}
if(topsort()) puts("Correct");
else puts("Wrong");
}
return 0;
}