例题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]<<" ";
}
cout<<endl;
}
只需要把拓扑排序里存入度为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]<<" ";
}
cout<<endl;
}
全部评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享