ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

找出知晓秘密的所有专家

2022-06-18 17:03:43  阅读:141  来源: 互联网

标签:找出 const int 秘密 head edge maxn que 知晓


 

 这道题目是一道Dijkstrra的题目。

我们先来回顾一下加边函数

void add(int u,int v,int w)
{
    edge[k].to=v;
    edge[k].w=w;
    edge[k].next=head[u];
    head[u]=k++;
}

这道题目可以用优先队列也可以用手写队列(我要用优先队列)

普通的大小根堆都要有三个参数但我们还可以这样:

struct qnode{
    int u,t;
    bool operator < (const qnode r) const 
    {
        return t>r.t;
    }
};
priority_queue<qnode> que;

主要说划下滑部分,就是重新定义<号 const 让r始终不变

我们这道题目就用结构体来写吧,用数组也行。

dij函数:

1.初始化que

2.在不为空情况下执行

  (一)  取出首点,判断用没用过,用过就continue

  (二) 然后将此点使用并将此点的vis值设为1

最后遍历一下每个专家,如果专家知道秘密就输出专家编号-1.

程序:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+20;
const int inf = 0x3f;
struct Edge{
    int to,next,w;
}edge[maxn];
int k,head[maxn];
void add(int u,int v,int w)
{
    edge[k].to=v;
    edge[k].w=w;
    edge[k].next=head[u];
    head[u]=k++;
}
int n,m,st;
int dis[maxn],vis[maxn],isok[maxn];
struct qnode{
    int u,t;
    bool operator < (const qnode r) const 
    {
        return t>r.t;
    }
};
priority_queue<qnode> que;
void dij()
{
    que.push({1,0});
    que.push({st,0});
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;
    }
    dis[1]=dis[st]=0;
    while(que.size())
    {
        qnode tmp=que.top();
        que.pop();
        int t=tmp.t;
        int u=tmp.u;
        if(vis[u]==1) continue;
        vis[u]=1;
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int w=edge[i].w;
            int to=edge[i].to;
            if(t<=w)
            {
                dis[to]=w;
                que.push({to,dis[to]});
            }
        }
    }
} 
int main()
{
    cin>>n>>m>>st;
    memset(head,-1,sizeof head);;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c);
        add(b,a,c);
    }
    dij();
    for(int i=1;i<=n;i++) if(dis[i]!=inf) printf("%d ",i-1);
    return 0;
}

 

标签:找出,const,int,秘密,head,edge,maxn,que,知晓
来源: https://www.cnblogs.com/wjk53233/p/16388703.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有