题目链接:http://acm.tju.edu.cn/toj/showp2892.html
题目大意:给定多组先后顺序 问可行么
思路:拓扑排序 复习一下拓扑排序吧:找入度为0的点,全部入栈,再依次出栈,出栈时,将与出栈节点相关连的节点入度减少1 同时再判断有入度为0的点 就入栈。如此循环 直到栈空。最后,可以在每次出栈前用一个计数器来技术。此计数器的值若等于节点的值,则拓扑可行。(因为,如果可行的话,每个点都会进栈 出栈的)
代码:
//拓扑排序
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
int map[25][25];
int indegree[25];
int main()
{
int cas,n,m,i,j,a,b;
cin>>cas;
while(cas--)
{
cin>>n>>m;
memset(map,0,sizeof(map));
memset(indegree,0,sizeof(indegree));
for(i=0;i<m;i++)
{
cin>>a>>b;
map[a][b]=1;
indegree[b]++; //这里顺便就把入度写了,不用后面再来个双重循环来写好么
}
//priority_queue<int,vector<int>,greater<int> >q;
queue<int> q;
int tflag = 0;
for(i=1;i<=n;i++)
{
if(indegree[i]==0)
{
q.push(i);
}
}
if(q.empty())
{
cout<<"0"<<endl;
continue;
}
int count = 0;
while(!q.empty())
{
int t = q.front();
q.pop();
count++;
for(i=1;i<=n;i++)
{
if(map[t][i])
{
indegree[i]--;
if(indegree[i]==0) //这里我开始不小心点了个分号,折腾了好久 天啊 还是要仔细仔细的说
q.push(i);
}
}
}
if(count !=n)
cout<<"0"<<endl;
else cout<<"1"<<endl;
}
}