用拓扑排序判断是否是DAG图
Legal or Not
#include<iostream>
#include<vector>
#include<map>
#include <cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn = 101;
int n,m;
int indegree[maxn];
int graph[maxn][maxn];
bool topoSprt(){
queue<int> q;
for (int i = 0; i < n; ++i)
{
if(indegree[i] == 0){
q.push(i);
}
}
int falg = 0;
while(!q.empty()){
int k = q.front();
q.pop();
falg++;
for (int i = 0; i < n; ++i)
{
if(graph[k][i]){
indegree[i]--;
graph[k][i] = 0;
if(indegree[i] == 0){ //不用管排序次序,所以把当前入度为0的节点全部入队
q.push(i);
}
}
}
}
return falg == n;
}
int main(int argc, char const *argv[])
{
while(cin>>n>>m && n && m){
memset(indegree,0,sizeof(indegree));
memset(graph,0,sizeof(graph));
for (int i = 0; i < m; ++i)
{
int a,b;
cin>>a>>b;
graph[a][b] = 1;
indegree[b]++;
}
if(topoSprt()) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
1.需要按照从小到大的次序,所以从1到n遍历,每找到一个符合入度为0的节点就暂时break,这样可以保证排列次序由小到大。
2.同时已经入队过的节点需要修改indegree=-1,防止后面又将其入队
#include<iostream>
#include<vector>
#include<map>
#include <cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn = 502;
int n,m;
int graph[maxn][maxn];
int indegree[maxn];
void topuSort(){
queue<int> q;
vector<int> v;
for (int i = 1; i <= n; ++i)
{
if(!indegree[i]){
q.push(i);
break;
}
}
while(!q.empty()){
int k = q.front();
q.pop();
indegree[k] = -1;
cout<<k<<endl;
v.push_back(k);
for (int i = 1; i <= n; ++i)
{
if(graph[k][i]){
indegree[i]--;
graph[k][i] = 0;
}
}
for (int i = 1; i <= n; ++i)
{
if(indegree[i] == 0){
q.push(i);
break;
}
}
}
cout<<v[0];
for (int i = 1; i < v.size(); ++i)
{
cout<<' '<<v[i];
}
cout<<endl;
}
int main(int argc, char const *argv[])
{
cin>>n>>m;
memset(indegree,0,sizeof(indegree));
memset(graph,0,sizeof(graph));
for (int i = 0; i < m; ++i)
{
int a,b;
cin>>a>>b;
graph[a][b] = 1;
indegree[b]++;
}
topuSort();
return 0;
}