NEUQ-ACM week9

这篇具有很好参考价值的文章主要介绍了NEUQ-ACM week9。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

T1.P4779 【模板】单源最短路径(标准版)

NEUQ-ACM week9,图论,算法,数据结构

思路:

1.这道题利用里vector建立邻接表。

2.运用优先队列重载运算符。

3.用的dijkstra算法的思想。

4.运用vis数组进行标记。

5.运用队列进行回溯。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int INF=1e9+5;
int dis[maxn];
bool vis[maxn];
int n,m,w;
struct node1
{
    int v;
    int s;
};
struct node2
{
    int to;
    int len;
};
bool operator<(node1 x,node1 y)
{
    return x.s>y.s;
}
vector<node2> mp[maxn];
priority_queue<node1> s;
void dijkstra()
{
    for(int i=1;i<=n;i++)
        dis[i]=INF;
    dis[w]=0;
    node1 p;
    p.v=w,p.s=0;
    s.push(p);
    while(!s.empty())
    {
        int top=s.top().v;
        s.pop();
        if(vis[top]) continue;
        for(int i=0;i<mp[top].size();i++)
        {
            int dv=mp[top][i].to;
            int ds=mp[top][i].len;
            if(dis[dv]>dis[top]+ds)
                dis[dv]=dis[top]+ds;
            node1 temp;
            temp.s=dis[dv],temp.v=dv;
            s.push(temp);
        }
        vis[top]=1;
    }
}
int main()
{
    int x,y,z;
    cin>>n>>m>>w;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y>>z;
        node2 p;
        p.to=y;p.len=z;
        mp[x].push_back(p);
    }
    dijkstra();
    for(int i=1;i<=n;i++)
        cout<<dis[i]<<' ';
}

T2. P5318 【深基18.例3】查找文献

NEUQ-ACM week9,图论,算法,数据结构

思路:

由于输出的时候是按序号大小的先后进行输出,因此考虑用vector存图,进行排序。

其实就是建图然后排序然后分别进行dfs和bfs

注意并不是所有的文章都能被小K看完,我们只需要从1开始看,看完从1开始的强连通部分即可

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct edge
{
    int u;
    int v;
};
vector <int> mp[N];//存具体信息的二维vector --这样写有点别扭哇
vector <edge> edg;//存边的结构体           --
bool vis_dfs[N],vis_bfs[N];
bool cmp(edge x, edge y)
{
    if(x.v==y.v) return x.u<y.u;//v相同按u排
    else return x.v<y.v;//否则按v从大到小排序
}
void dfs(int x)
{
    vis_dfs[x]=true;
    cout<<x<<' ';
    for(int i=0;i<mp[x].size();i++)
    {
        int next_point=edg[mp[x][i]].v;
        if(!vis_dfs[next_point]) dfs(next_point);
    }
}
void bfs(int x)
{
    queue<int> q ;
    q.push(x);
    cout<<x<<' ';
    vis_bfs[x]=true;
    while(!q.empty())
    {
        int top=q.front();
        for(int i=0;i<mp[top].size();i++)
        {
            int point=edg[mp[top][i]].v;
            if(!vis_bfs[point])
            {
                q.push(point);
                cout<<point<<' ';
                vis_bfs[point]=true;
            }
        }
        q.pop();
    }
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int u,v;
        cin>>u>>v;
        edg.push_back((edge){u,v});//初始化存边的s数组
    }
    sort(edg.begin(),edg.end(),cmp);
    for(int i=0;i<m;i++) mp[edg[i].u].push_back(i);//初始化mp
    dfs(1);          //在mp[edg[i].u](也就是i号边的起点edg[i].u连接的边的数组)中存入i号边
    cout<<endl;
    bfs(1); 
}

T3.U80592 【模板】floyd

NEUQ-ACM week9,图论,算法,数据结构

思路:

floyd的应用,主要是核心三行代码

通过三重循环(i,j,k)来求i与j的最短路,用i作为转折点

 for(int i=1;i<=n;i++)//floyd精髓-*从j号顶点到k号顶点只经过前i号点的最短路程*
        for(int j=1;j<=n;j++)//
            for(int k=1;k<=n;k++)//
                if(dis[j][i]+dis[i][k]<dis[j][k])//
                    dis[j][k]=dis[j][i]+dis[i][k];//

代码如下:

#include<bits/stdc++.h>
using namespace std;
const long long mod=998244354;
long long dis[5005][5005];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            dis[i][j]=INT_MAX;
            dis[i][i]=0;
        }
    }
    for(int i=1;i<=m;i++)
    {
        long long x,y,l;
        cin>>x>>y>>l;
        dis[x][y]=min(l,dis[x][y]);
        dis[y][x]=min(l,dis[y][x]);
    }
    for(int i=1;i<=n;i++)//floyd精髓-*从j号顶点到k号顶点只经过前i号点的最短路程*
        for(int j=1;j<=n;j++)//
            for(int k=1;k<=n;k++)//
                if(dis[j][i]+dis[i][k]<dis[j][k])//
                    dis[j][k]=dis[j][i]+dis[i][k];//
    for(int i=1;i<=n;i++)
    {
        int ans=0;
        for(int j=1;j<=n;j++)
            if(dis[i][j]!=INT_MAX) ans=(ans+dis[i][j])%mod;
        cout<<ans<<endl;
    }
}

p.s这周倒了😷..所以学的不是很深,dijkstra和他的堆优化还是云里雾里的感觉(⊙_⊙)

下周努努力把这玩意儿弄明白!!

 文章来源地址https://www.toymoban.com/news/detail-597968.html

到了这里,关于NEUQ-ACM week9的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版)

    最短路Dijkstra,spfa,图论二分图算法AYIT—ACM训练(模板版) A — Dijkstra B — spfa/Dijkstra C — 二分图 D — 二分图 E — 二分图 F — 二分图 G — Dijkstra H — Topsort Dijkstra算法基础模板题 💬 模板演示: 朴素版本Dijkstra: 💬 代码演示: 🚩 运行结果: spfa算法: 💬 代码演示: 🚩

    2024年02月10日
    浏览(49)
  • ACM模板(快速幂、数论、图论)

    目录 〇,全文说明、宏定义代码 一,代数 二,单例、快速幂、数论 二,test 类里面和宏定义处都有接口注释,因为宏不体现具体参数,所以注释以类里面的为准。 所有代码放在一起是可以编译运行的,如果按照章来划分,除了最后一章是测试代码,其他任意一章都可以单独

    2024年02月13日
    浏览(38)
  • [Week 20]每日一题(C++,图论,数学,搜索)

    目录 T1 [Daimayuan] Collision(C++,多源最短路) 题目描述 输入描述 输出描述 样例输入1 样例输出1 样例输入2 样例输处2 数据范围 解题思路 T2 [Daimayuan] 农田划分(C++,数学,BFS) 题目描述 题目输入 题目输出 样例输入1 样例输出1 样例输入2 样例输出2 数据范围 解题思路 T3 [Dai

    2024年02月08日
    浏览(45)
  • 算法练习 Week2

    目录 1.特殊正方形: 2.走楼梯2: 3.走路: 4.简单分数统计:  5.Alice的德州扑克: 6.订单编号: 7.饿饿 饭饭: 8.任务分配: 题目 输入n,输出n行n列的由+和.组成的正方形,其中最外面一圈全是+,第二圈全是.,…,对于第i圈,如果i是奇数,那么全是+,否则全是.。 输入格式

    2023年04月18日
    浏览(36)
  • 算法题的ACM模式与核心代码模式

    身为一名程序员,刷题网站系统我们应该再熟悉不过了,除了针对竞赛的 OJ 系统,比如:POJ;还有很多专为求职提供的刷题 OJ 系统,比如:leetcode、牛客网 等。 这两类 OJ 在刷题模式上有些区别,一般竞赛的 OJ 系统是针对 ACM 模式的,而求职的 OJ 系统是针对核心算法模式的

    2024年02月14日
    浏览(56)
  • 算法刷题 week4

    1.斐波那契数列 题目 题解 (递推 + 滚动变量) O(n) 这题的数据范围很小,我们直接模拟即可。 当数据范围很大时,就需要采用其他方式了,可以参考 求解斐波那契数列的若干方法 。 F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就

    2024年02月07日
    浏览(39)
  • 代码随想录-回溯算法(分割问题)|ACM模式

    目录 前言: 131. 分割回文串 题目描述: 输入输出描述: 思路和想法: 93. 复原 IP 地址 题目描述: 输入输出描述: 思路和想法:          回溯算法中的分割问题,是可以抽象为组合问题的,其中模拟切割线、切割问题中递归如何终止以及递归循环中如何截取子串,是我们

    2024年02月15日
    浏览(56)
  • 代码随想录-回溯算法(子集问题)|ACM模式

    目录 前言: 78. 子集 题目描述: 输入输出描述: 思路和想法: 90. 子集 II 题目描述: 输入输出描述: 思路和想法: 491. 递增子序列 题目描述: 输入输出描述: 思路和想法: 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话, 那么组合问题和分割问题都是收集

    2024年02月15日
    浏览(156)
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之006 week01 02-06 循环不变量

    循环不变量 之前我们讲的线性查找法的核心代码如下: 我们是否有思考过,这样一个简单的查找算法,用到了循环,但是每一轮循环开始前,需要满足的条件是什么? 其实,循环开始时,需要确认: 确认data[i]是否是目标 通过语句,if (data[i].equals(target))判断 循环体执行完一

    2023年04月18日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包