【CCF】交通规划 Dijstra变形 优先级队列重载

【题意】

给定一个无向图,求这个图满足所有点到顶点的最短路径不变的最小生成树

【AC】

注意双向边要开2*maxm

注意优先级队列

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>

using namespace std;
int n,m;
const int maxn=1e4+2;
const int maxm=1e5+2;
const int inf=0x3f3f3f3f;
struct node{
    int to;
    int nxt;
    int w;
}e[2*maxm];
int head[maxn];
int tot;
int dis[maxn];
int fa[maxn];
bool vis[maxn];
void init(){
    memset(head,-1,sizeof(head));
    tot=0;
}
void add(int u,int v,int w){
    e[tot].to=v;
    e[tot].w=w;
    e[tot].nxt=head[u];
    head[u]=tot++;
}
struct Node{
    int id;
    int fa;
    int d;
    Node(int _id,int _d,int _fa):id(_id),d(_d),fa(_fa){}
    bool operator < (const Node& a) const{
        if(d!=a.d){
            return d>a.d;
        }
        return fa>a.fa;
    }
};
int dijkstra(int s){
    priority_queue<Node> Q;
    memset(vis,false,sizeof(vis));
    memset(dis,inf,sizeof(dis));
    memset(fa,inf,sizeof(fa));
    dis[s]=0;
    fa[s]=0;
    Q.push(Node(s,dis[s],fa[s]));
    int ans=0;
    while(!Q.empty()){
        Node q=Q.top();
        Q.pop();
        int u=q.id;
        if(vis[u]) continue;
        vis[u]=true;
        ans+=q.fa;
        for(int i=head[u];i!=-1;i=e[i].nxt){
            int v=e[i].to;
            int w=e[i].w;
            if(dis[u]+w<dis[v]){
                dis[v]=dis[u]+w;
                fa[v]=w;
            }else if(dis[u]+w==dis[v]&&w<fa[v]){
                fa[v]=w;
            }
            Q.push(Node(v,dis[v],fa[v]));
        }
    }
    return ans;

}
int main(){
    while(~scanf("%d%d",&n,&m)){
        if(n==1){
            printf("0\n");
            continue;
        }
        init();
        int u,v,w;
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
        }
        int ans=dijkstra(1);
        printf("%d\n",ans);
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/itcsl/p/9189383.html

时间: 2024-10-15 18:48:00

【CCF】交通规划 Dijstra变形 优先级队列重载的相关文章

队列的应用:优先级队列

优先级队列:如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了. 优先级队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素(3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行. 以上是网上常见的对优先级队列的描述.偷

priority_queue 优先级队列

priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素).在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到.在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置.下面给出priority_queue的函数列表和VS2008中priority

经典白话算法之优先级队列

<1>概念 优先级队列,顾名思义,就是一种根据一定优先级存储和取出数据的队列.它可以说是队列和排序的完美结合体,不仅可以存储数据,还可以将这些数据按照我们设定的规则进行排序.优先级队列是堆的一种常见应用.有最大优先级队列(最大堆)和最小优先级队列(最小堆).优先级队列是一种维护有一组元素构成的集合S的数据结构. <2>优先队列支持的基本运算 [cpp] view plaincopy //建立一个保存元素为int的优先级队列,其实是建了一个小顶堆 //但是请特别注意这样的建的堆默认是

c++ 优先级队列(priority_queue)

从网上搜优先级队列用法,都是有些乱七八糟的,有几种用法都没说,直接贴代码.实在郁闷,于是自己在此归纳归纳. 废话不多说,直入主题. 优先级队列的核心是比较函数的实现. 比较函数有两种实现方法: 1.在结构体或类外面定义一个比较结构体.  //假如有个Point结构体.则new对象的时候:priority_queue<Point,vector<Point>,cmp> pg;其中cmp是自定义比较函数 2.在结构体或类中自己重载<操作符.   //假如有个Point结构体.这种方

优先级队列(Priority Queue)

优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素.但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列. 1. 优先级队列的概念 1.1 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. 1.2 优先级队列的特点 优先级队列是0个或多个元素的集合,每个元素都有一个优先权或值

C++学习之路: 优先级队列使用模板(防止忘记)

当优先级队列中存放我们自定义规则时, 编译器不知道该如何排序 如: priority_queue<Person> 这种代码是无法通过编译的, 需要我们手动写一个比较规则 priority_queue<Person, comp> 即可 代码如下 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <queue> 5 #include <f

ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))

一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将IO时间消耗降到很低. 任务调度(Schedule) 描述 某高性能计算集群(HPC cluster)采用的任务调度器与众不同.为简化起见,假定该集群不支持多任务同时执行,故同一时刻只有单个任务处于执行状态.初始状态下,每个任务都由称作优先级数的一个整数指定优先级,该数值越小优先级越高:若优先级数相等

1.5 实现优先级队列

body, td { font-family: 微软雅黑; font-size: 10pt; } Edit 1.5 实现优先级队列 问题: 实现一个队列,能够按照给定的优先级排序,并且每次pop操作时都可以返回优先级最高的那个元素. 解决方案 1.import heapq2.class PriorityQueue:3. def __init__(self):4. self._queue=[]5. self._index=06. def push(self,item,priority):7. he

【数据结构】用模版实现大小堆、实现优先级队列,以及堆排序

一.用模版实现大小堆 如果不用模版的话,写大小堆,就需要分别实现两次,但是应用模版的话问题就简单多了,我们只需要实现两个仿函数,Greater和Less就行了,仿函数就是用类实现一个()的重载就实现了仿函数.这个看下代码就能理解了.再设计参数的时候,需要把模版设计成模版的模版参数,因为要实现大小堆嘛!当我们实现好一个大堆或者小队的逻辑后只需要用模版接收的Greater或Less类定义一个变量,就能实现通用功能了. template<typename T> struct Less {     b