priority_queue<int,vector<int>,greater<int> >q4;//注意“>>”会被认为错误, //这是右移运算符,所以这里用空格号隔开,小顶堆
priority_queue<int,vector<int>,less<int> >q5;//大顶堆
#include<iostream> #include<vector> #define N 505 #include<string.h> #include<queue> using namespace std; int n,m,k; int in[N]; vector<int>p[N]; int Next[N]; void toposort() { k=0; priority_queue<int,vector<int>,greater<int> >q; for(int i=1;i<=n;++i) if(in[i]==0) q.push(i); while(!q.empty()) { int u=q.top(); q.pop(); Next[k++]=u; for(int i=0;i<p[u].size();++i) { int v=p[u][i]; if(in[v]==1) q.push(v); else in[v]--; } } } int main() { while(cin>>n>>m) { memset(in,0,sizeof(in)); memset(p,0,sizeof(p)); for(int i=0;i!=m;++i) { int a,b; cin>>a>>b; p[a].push_back(b); in[b]++; } toposort(); for(int i=0;i<k-1;++i) cout<<Next[i]<<" "; cout<<Next[k-1]<<endl; }return 0; }
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
因此优先队列中最大堆
struct info
{
string name;
float score;
bool operator<(const info &a) const
{return score<a.score;}
};
或者
struct info//最小堆
{
string name;
float score;
bool operator<(const info &a) const
{return a.score<score;}
};
struct cmp
{
bool operator()(const info &a,const info &b)
{return a.score<b.score;}
};
priority_queue<info,vector<info>,cmp>s;