zoukankan      html  css  js  c++  java
  • 优先队列

    一、默认优先级

    我们知道了队列是先进先出,那么优先队列则不一样了,进的顺序不能决定出的顺序,优先队列出的顺序是按照自己设置的优先等级来出队列的,如果自己不设置优先级的话,默认优先级为越大优先级越高。

    例如:

    #include <iostream>
    #include <queue>
    using namespace std;
    priority_queue<int>que;
    int main()
    {
    	que.push(1);
    	que.push(3);
    	que.push(5);
    	que.push(4);
    	que.push(2);
    	while(!que.empty())
    	{
    		cout<<que.top()<<endl;
    		que.pop();
    	}
    	return 0;
    	
    }
    //输出结果为5、4、3、2、1

    二、优先级的设置

    我们知道既然默认的优先级是越大优先级越高,那么我们如何来更改这个优先级呢?

    1、int型

    priority_queue <int ,vector <int >, greater <int > > que ;
    priority_queue <int ,vector <int >,less <int > > que ;

    测试代码如下:

    #include <iostream>
    #include <queue>//所需头文件 
    #include <vector>//所需头文件 
    using namespace std;
    int main()
    {
    	priority_queue<int,vector<int>,less<int> >que1;//输出结果从大到小排序 
    	priority_queue<int,vector<int>,greater<int> >que2;//输出结果从小到大排序 
    	que1.push(1);
    	que1.push(5);
    	que1.push(3);
    	que1.push(2);
    	que1.push(4);
    	que2.push(1);
    	que2.push(5);
    	que2.push(3);
    	que2.push(2);
    	que2.push(4);
    	cout<<"que1: ";
    	while(!que1.empty())
    	{
    		cout<<que1.top()<<" ";
    		que1.pop();
    	}
    	cout<<endl;
    	cout<<"que2: ";
    	while(!que2.empty())
    	{
    		cout<<que2.top()<<" ";
    		que2.pop();
    	}
    	cout<<endl;
    	return 0;
    }
    /*输出结果为:que1: 5 4 3 2 1 
                que2: 5 4 3 2 1
    */ 

    2、结构体型(和sort结构体排序的cmp类似)

    struct node
    {
    int c,d;
    };
    bool operator <( const node & a, const node & b)//重载运算符
    {
    if(a.c==b.c) return a.d<b.d;
    return a.c<b.c;
    }
    priority_queue <node > que ;

    测试代码:

    #include <iostream>
    #include <queue>
    using namespace std;
    struct node
    {
    	int n,m;
    	friend bool operator< (const node &a,const node &b)
    	{
    		if(a.m!=b.m) return a.m>b.m;//若m不相同,则m小的放在前面(与正常逻辑相反)
    		return a.n<b.n;//若m相同,则n大的放在前面(与正常逻辑相反) 
    	} 
    }N[1000];
    int main()
    {
    	priority_queue<node> que;
    	for(int i=0;i<6;i++)
    	{
    		cin>>N[i].n>>N[i].m;
    		que.push(N[i]);
    	}
    	while(!que.empty())
    	{
    		cout<<"n: "<<que.top().n<<" m: "<<que.top().m<<endl;//先进先出
    		que.pop(); 
    	}
    	while(!que.empty()) que.pop();//清空 
    	return 0;
    }

    运行结果:

    关于结构体优先级的设置可以参照HDU1873题 看病要排队

    链接:https://blog.csdn.net/KK_2018/article/details/81259019

  • 相关阅读:
    【Educational Codeforces Round 36 C】 Permute Digits
    【Educational Codeforces Round 36 B】Browser
    【Educational Codeforces Round 36 A】 Garden
    【习题 8-14 UVA
    【习题 8-13 UVA
    【习题 8-12 UVA
    【习题 8-11 UVA
    【习题 8-10 UVA
    关于货仓选址问题的方法及证明(在数轴上找一点使得该点到所有其他点的距离之和最小)
    P2512 [HAOI2008]糖果传递
  • 原文地址:https://www.cnblogs.com/cnlik/p/11851885.html
Copyright © 2011-2022 走看看