例题11.9确定比赛名次

/*
只需要把拓扑排序里存入度为0的结点的队列改成greater的优先队列
*/

#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;

vector<int> graph[125000];
int indegree[501];

vector<int> TuoPu(int n)
{
priority_queue<int,vector<int>,greater<int>> q;
for(int i=1;i<=n;i++)
{
if(indegree[i]==0)q.push(i);
}
vector<int> ans;
while(!q.empty())
{
int u=q.top();
q.pop();
ans.push_back(u);
for(int i=0;i<graph[u].size();i++)
{
int v=graph[u][i];
indegree[v]--;
if(indegree[v]==0)q.push(v);
}
}

return ans;
}

int main()
{
int n,m;
while(cin>>n>>m)
{
memset(graph,0,sizeof(graph));
memset(indegree,0,sizeof(indegree));
for(int i=1;i<=m;i++)
{
int from,to;
cin>>from>>to;
graph[from].push_back(to);
indegree[to]++;
}
 } 

vector<int> ans=TuoPu(n);
for(int i=0;i<ans.size();i++)
{
 cout<<ans[i]<<&quot; &quot;;
}
cout<<endl;

}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务