首页 > 编程语言 >acwing算法基础课学习记录2(2024.3.29)

acwing算法基础课学习记录2(2024.3.29)

时间:2024-04-03 13:59:41浏览次数:20  
标签:2024.3 dist idx int 29 st include 模板 acwing

对昨日的补充

朴素dijkstra算法
模板:
      1.dist[i]=+INF dist[1]=0
      2. for i 1~n     n次
            t<-不在s中的距离最近的点  (s:当前已经确定最短距离的点存储在内)  n次
            s<-t         n次
            用t更新其他点的距离   总共m次
堆优化版dijkstra
模板:
      1.dist[i]=+INF dist[1]=0
      2. for i 1~n     n次
            t<-不在s中的距离最近的点  (s:当前已经确定最短距离的点存储在内)  朴素:n次  堆:o(1)
            s<-t         n次
            用t更新其他点的距离   朴素:总共m次  堆:多了把更新的点push到堆 总共 用优先队列mlogm次相当于mlogn  用手写堆nlogn

今日把直播课搜索与图论(2)看完了,并且完成了相关的练习题

bellman

bellman-ford算法
        bellman算法 边可以用任意东西来存边,有负权边回路可能无解,但如果负环不在路径上就不影响(spfa算法要求一定没有负环)
        迭代k次的dist数组的数代表从1号点走不超过k条边的最短距离  由此可知如果第n次循环有更新,肯定有一个最短路径是经过n条边,则这个最短路经过n+1个点,推断得知有负环
模板:     for n次
            备份
            for所有边abw
                dist[b]=min(dist[b],dist[a]+w);

题目:有边数限制的最短路

//没啥可说的 边看边写的,和抄的差不多
#include<iostream>
#include<cstring>
using namespace std;
const int  N=10010;
struct Edge{
    int a,b,c;
}edge[N];
int n,m,k;
int dist[510],backup[510];
int bell(){
    memset(dist,0x3f,sizeof dist);
    dist[1]=0;
    for(int i=0;i<k;i++){
        memcpy(backup,dist,sizeof dist);
        for(int j=0;j<m;j++){
            dist[edge[j].b]=min(dist[edge[j].b],backup[edge[j].a]+edge[j].c);
        }
    }
    return dist[n];
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        edge[i].a=x,edge[i].b=y,edge[i].c=z;
    }
    bell();
    if(dist[n]>0x3f3f3f3f/2)cout<<"impossible";
    else cout<<dist[n];

}

spfa算法

spfa算法
模板:
      queue<-1
      while queue不空
           t<-q.front q.pop
           用t遍历所有出边b
             if(b不在队列)  queue<-b

题目:

spfa求最短路

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=100010;
int h[N],e[N],ne[N],w[N],idx;
int n,m;
int dist[N];
int st[N];
void add(int a,int b,int c){
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
void spfa(){
    memset(dist,0x3f,sizeof dist);
    dist[1]=0;
    queue<int>q;
    q.push(1);
    st[1]=1;
    while(q.size()){
        int t=q.front();
        q.pop();
        st[t]=0;

        for(int j=h[t];j!=-1;j=ne[j]){
            if(dist[e[j]]>dist[t]+w[j]){
                dist[e[j]]=dist[t]+w[j];
                if(st[e[j]])continue;
                q.push(e[j]);
                st[e[j]]=1;
            }
        }

    }
    return;
}
int main(){
    memset(h,-1,sizeof h);
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
    }
    spfa();
    if(dist[n]==0x3f3f3f3f)cout<<"impossible";
    else cout<<dist[n];

}

spfa判断负环

//误打误撞提交上对了,和模板区别挺大的,看不懂 以后再想想吧,先按照模板写
//模板就不贴了
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=100010;
int h[N],e[N],ne[N],w[N],idx;
int n,m;
int dist[N];
int st[N];
void add(int a,int b,int c){
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int cnt[N];
int spfa(){
    // memset(dist,0x3f,sizeof dist);
    memset(st,1,sizeof st);
    dist[1]=0;
    queue<int>q;
    // q.push(1);
    st[1]=1;
    for(int i=1;i<=n;i++)q.push(i);
    while(q.size()){
        int t=q.front();
        q.pop();
        st[t]=0;

        for(int j=h[t];j!=-1;j=ne[j]){
            if(dist[e[j]]>dist[t]+w[j]){
                dist[e[j]]=dist[t]+w[j];
                if(st[e[j]])continue;
                q.push(e[j]);
                st[e[j]]=1;
                cnt[e[j]]++;
                if(cnt[e[j]]>=n-1)return -1;
            }
        }

    }
    return 0;
}
int main(){
    memset(h,-1,sizeof h);
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
    }

    if(spfa()==-1)cout<<"Yes";
    else cout<<"No";

}

floyd算法 题目:Floyd求最短路

#include<iostream>
using namespace std;
int s[210][210];
int n,m,q;
void floyd(){
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                s[i][j]=min(s[i][j],s[i][k]+s[k][j]);
            }
        }
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(i==j)s[i][j]=0;
            else s[i][j]=1e9;
        }
    for(int i=1;i<=m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        if(z<s[x][y])s[x][y]=z;
    }
    floyd();
    while(q--){
        int x,y;
        scanf("%d%d",&x,&y);
        if(s[x][y]>1e9 / 2)printf("impossible\n");
        else printf("%d\n",s[x][y]);
    }
}

网上找的floyd判断是否有负环

for(int i = 1; i <=n ; i++)
		if(d[i][i] < 0) return true;
	return false; 

今日练习的挺少的,应该多抄抄模板,刚开始学前两个最短路还挺清晰,现在学多了全都记不太清是啥了

明日任务:多熟悉这两天学的求最短路问题的模板,给搜索与图论(3)开头

标签:2024.3,dist,idx,int,29,st,include,模板,acwing
From: https://blog.csdn.net/bawangtianzun/article/details/137157261

相关文章

  • 就业班 第二阶段 2401--3.29 day9 shell之正则+数组
    九、shell编程-数组普通数组:只能用整数作为数组的索引关联数组:可以使用字符串作为数组的索引数组定义普通数组定义:[root@newrainshell]#books=(linuxshellawksed) 引用:[root@newrainshell]#echo${books[0]}linux[root@newrainshell]#echo${books......
  • ACwing291. 蒙德里安的梦想
    注意:这道题不能像小国王那样,预处理出一个useful数组,存储所有可用的状态:for(inti=2;i<=m+1;i++)for(intj=0;j<1<<n;j++){f[i&1][j]=0;for(intk:Trans[j])f[i][j]+=f[(i-1)][k];}......
  • 3.29毕设
    vue3:computed(计算属性)是有缓存的,而且是只读的,如果计算中包括的数据不改变的话,则不需要重新计算,而普通的方法没有缓存通过计算方法,我们可以将一些简单的基本数据类型拼接成我们需要的复杂的数据类型 vue3:watch(监视属性),我认为监视属性可以分为四种情况情况一:监视【ref】定义......
  • ACwing1064. 小国王
    线性状压DP#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#include<vector>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;......
  • 2024.3.31
    2024.3.31【人间骄阳刚好,风吹过树梢,彼时他们正当年少——某某】Sunday二月二十二<BGM=那年·年少-宋宇宁><theme=oi-"search">来看道典题P1763埃及分数附本体链接//2024.3.31//bywhite_ice#include<bits/stdc++.h>usingnamespacestd;#defineitnlongl......
  • q1-投资理财-2024.3.31
    q1-投资理财-2024.3.31​ 接上回,持有的徐工机械,一边下跌一边加仓,截止到5.86清仓想全仓做t,等第二天下跌下来再买入,没想到直接高开6个点,望尘莫及,亏死。​ 盈利的基本不去动了,亏损的等以后看看能不能想办法搞回来,传智资金到12-13左右就资金一直在流出,这玩应,我发现资金流入的很有......
  • 2024.3.31补题
    SMU2024spring天梯赛2(补题)https://pintia.cn/problem-sets/1772539187410104320/exam/overview7-10红色警报错误:①没写②用的unordered_map<>判断的联通条件。只要有城市和它相连就判它在城市群里,只对了样例。。。③不会深搜。。。#include<bits/stdc++.h>using......
  • AcWing刷题-区间合并
    校门外的树区间合并:fromtypingimportListdefmerge(intervals:List[List[int]])->List[List[int]]:#按照第一个元素从小到大进行排序intervals.sort(key=lambdax:x[0])#初始化一个新的数组new_list=list()foriinintervals:......
  • <商务世界>《第29课 外贸展会上应注意的事项》
    1参展前需要知道的问题1)在开展前,是否发邀请给外商,告诉他们你的展位号,你的企业及产品的优势?2)你的展位布置是否能够吸引外商?3)你参展的产品是否具有个性,特色,还是雷同其他企业?4)你的业务人员的业务素质是否专业?5)你是否在当天邀约对我们产品有兴趣的客户,在某某酒店继续面对......
  • 2023最新293TV v6.2 APP源码 神马TV影视APP源码可对接易支付 修复搜索附安装教程
    神马TV影视APP源码可对接易支付修复搜索附安装教程源码简介2023最新版本293TV、神马tv源码6.2版本修复首字母拼音搜索支持所有易支付解决6.2版本通病自动巡检删除后台文件JSON和api解析后台随意设置总共有5套后台:中控后台,会员后台,苹果CMS后台,反馈后台,解析后台,会员......