因为近期比赛有很多图论,但我不会,所以从头开始学,除了bfs判断连通外,这是第一个重点吧,以后都会用到
拓扑排序主要解决的问题是 比赛名次构建的有向无环图,若有环,则不存在拓扑排序;
主要是根据入度和队列来解决的;
若输出序编号小的排前边,则用优先队列;
代码:
拓扑排序主要解决的问题是 比赛名次构建的有向无环图,若有环,则不存在拓扑排序;
主要是根据入度和队列来解决的;
若输出序编号小的排前边,则用优先队列;
代码:
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int maxn=510;
int n,m;
int dis[maxn];
vector<int> G[maxn];
int main()
{
int i,j;
while(cin>>n>>m)
{
priority_queue<int ,vector<int> ,greater<int> > s;
memset(dis,0,sizeof(dis));
for(i=0;i<=n;i++)
{
G[i].clear();
}
//queue<int> s;
int u,v;
int start=0;
for(i=1; i<=m; i++)
{
cin>>u>>v;
dis[v]++;
G[u].push_back(v);
}
for(i=1;i<=n;i++)
{
if(dis[i]==0)
{
s.push(i);
}
}
while(!s.empty())
{
int p=s.top();
s.pop();
start++;
if(start==1)
{
cout<<p;
}
else
{
cout<<' '<<p;
}
for(i=0;i<G[p].size();i++)
{
int vv=G[p][i];
if(dis[vv])
{
dis[vv]--;
if(dis[vv]==0)
{
s.push(vv);
}
}
}
}
cout<<endl;
}
return 0;
}