spfa的特殊用法

news2024/10/5 16:24:04

spfa通常用来求带有负权边的最短路问题,但是它还有两种特别的用法——求负环和求差分约束

求负环

我们回顾spfa算法,本质上是一个点的距离被更新以后再用它去更新其他的点。将被更新的点放入队列中,这样一直更新,直到没有任何点可以被更新后结束。形象一点,spfa实际上也相当于一层一层的扩展,但是由于有负权边,所以已经被赋值的点还会被更新而已,所以一个点如果被更新n次,那么如果没有负权回路的话,这条路径上就应该由n+1个点,但总共才n个点,很明显不成立,那么就可以证明有负权回路,也即负环。

所以要想求图中是否有负环,其实我们只要记录每个点被更新的次数即可。

在找负环的时候,最初是把所有的点都放进队列了,因为图未必连通,所以从某个点开始找,该点所在的连通块中未必有负环。同时找负环是d[]的初值也不重要了,因为我们只看更新次数,只要有负的就更新。

904. 虫洞(活动 - AcWing)

这题比较迷惑人的一点在于要在开始时间之前回到出发地,那么就有时间和空间两个维度,在时间上和空间上都要回到出发地,在空间上回去就说明图中有回路,否则无法回去,因为边权是时间,所以在时间上回去就说明有负权回路。那么看似很绕,实际上就是一个求负环的问题。

#include<bits/stdc++.h>
using namespace std;
const int N=600,M=6000;
int h[N],e[M],ne[M],w[M],idx;
int n,m,k;
int d[N],st[N],cnt[N];
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int spfa()
{
    memset(d,0x3f,sizeof d);
    memset(cnt,0,sizeof cnt);
    memset(st,0,sizeof st);
    queue<int>q;
    for(int i=1;i<=n;i++) 
    {
        st[i]=1;
        q.push(i);
    }
    while(q.size())
    {
        int t=q.front();
        q.pop();
        st[t]=0;
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]>d[t]+w[i])
            {
                d[j]=d[t]+w[i];
                cnt[j]=cnt[t]+1;//被多少个点更新
                if(cnt[j]>=n) return 1;
                if(!st[j]) st[j]=1,q.push(j);
            }
        }
    }
    return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&k);
        memset(h,-1,sizeof h);
        idx=0;
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c),add(b,a,c);
        }
        for(int i=1;i<=k;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,-c);
        }
        if(spfa()) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
}

361. 观光奶牛(361. 观光奶牛 - AcWing题库)

求f/g最大,这是典型的01分数问题。这种题的解题套路很固定,就是用二分来解:

ans=sum(f)/sum(g)

要求ans的最大值,所以ans符合要求的时候需要往大的找,那么只能是二分出来的mid小于等于ans,然后才能去找更大的。

ans>=mid

sum(f)-sum(g)*mid>=0

sum(f-g*mid)>=0

f-g*mid是什么意思呢?显然是点权-边权*mid,又要考虑点权,又要考虑边权很麻烦,所以我们可以把点权放到边权上去,即将边权变为f-g*mid,然后求正环。那么是把起始点权放上去,还是把终点权放上去呢,其实都可以,这里我们把起始点的点权放上去。

#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=5010;
int n,m;
int wf[N];
int h[N],e[M],wt[M],ne[M],idx;
int st[N],cnt[N];
double d[N];
void add(int a,int b,int c)
{
    wt[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int spfa(double mid)
{
    memset(d,0,sizeof d);
    memset(cnt,0,sizeof cnt);
    memset(st,0,sizeof st);
    queue<int>q;
    for(int i=1;i<=n;i++)
    {
        q.push(i);
        st[i]=1;
    }
    while(q.size())
    {
        int t=q.front();
        q.pop();
        st[t]=0;
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]<d[t]+wf[t]-mid*wt[i])
            {
                d[j]=d[t]+wf[t]-mid*wt[i];
                cnt[j]=cnt[t]+1;
                if(cnt[j]>=n) return 1;
                if(!st[j])st[j]=1,q.push(j);
            }
        }
    }
    return 0;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&wf[i]);
    memset(h,-1,sizeof h);
    for(int i=1;i<=m;i++) 
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    double l=0,r=1e6;
    while(r-l>1e-4)
    {
        double mid=(l+r)/2;
        if(spfa(mid)) l=mid;
        else r=mid;
    }
    printf("%.2lf",r);
}

1165. 单词环(活动 - AcWing)

 这道题求环串/单词个数的最大值,显然也是一个01分数问题。那么我们可以套用上一题的思路来写。但是有一点,我们惯性是要在两个单词之间建边的,但是n的范围实在太大,如果在两个单词之间建边,那么根本存不下,所以这题我们另辟蹊径,反正实际有效的只有开头两个字母和结尾两个字母,那么我们直接在开头两个字母和结尾两个字母之间建边,边权等于单词长度。这样将两个单词视为点的话就只有26*26=676个点,建边绰绰有余。然后我们来推公式:

ans=sum(len)/n

ans要不断往大的找,所以mid<=ans:

ans>=mid

sum(len)/n>=mid

sum(len)>=n*mid

sum(len)-n*mid>=0

sum(len-mid)>=0

那么还是和上面一样求正环。

但是本题比较特殊,如果用cnt[j]>=n判退出的话,是会超时的,有一个取巧的经验值,当总的更新次数到4n左右的时候,就可以直接判退出了。其实这个常数可以试出来,如果正常写超时的话,可以用试个常数出来取巧。

#include<bits/stdc++.h>
using namespace std;
const int N=700,M=100010;
int n;
int h[N],w[M],ne[M],e[M],idx;
int cnt[N],st[N];
double d[N];
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int check(double mid)
{
    memset(cnt,0,sizeof cnt);
    memset(st,0,sizeof st);
    queue<int>q;
    for(int i=0;i<676;i++) 
    {
        q.push(i);
        st[i]=1;
    }
    int count=0;
    while(q.size())
    {
        int t=q.front();
        q.pop();
        st[t]=0;
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]<d[t]+w[i]-mid)
            {
                d[j]=d[t]+w[i]-mid;
                cnt[j]=cnt[t]+1;
                if(++count>4*N) return 1;
                if(cnt[j]>=N) return 1;
                if(!st[j])
                {
                    st[j]=1;
                    q.push(j);
                }
            }
        }
    }
    return 0;
}
int main()
{
    while(~scanf("%d",&n))
    {
        if(!n) break;
        memset(h,-1,sizeof h);
        idx=0;
        for(int i=1;i<=n;i++)
        {
            string s;
            cin>>s;
            int len=s.size();
            if(len>=2)
            {
                int a=(s[0]-'a')*26 + s[1]-'a';
                int b=(s[len-2]-'a')*26+s[len-1]-'a';
                add(a,b,len);
            }
        }
        if(!check(0)) printf("No solution\n");
        else
        {
            double l=0,r=1000;
            while(r-l>1e-4)
            {
                double mid=(l+r)/2;
                if(check(mid))l=mid;
                else r=mid;
            }
            cout<<l<<endl;
        }
    }
}

差分约束

 差分约束可以用来求不等式组的可行解以及满足一系列不等式关系限制的最大值最小值。

为什么呢?因为不等式关系可以与最短路联系起来进而建边构图,比如x1<=x2+c,如果在最短路里面,x1的值更新的条件是什么呢?显然是x1>x2+c,所以如果有x1到x2的最短路,那么就满足上述条件了。所以我们可以建一条x2指向x1的边,边权为c。如果有一系列的不等式关系:x1<=x2+c1,x2<=x3+c2,x3<=x4+c3,...那么如果能确定1的值,求剩下每个点的最大值显然就是求x1到所有点的最短路。由此我们推出一般性的结论。

求不等式组的可行解

源点需要满足的条件:从源点出发,一定可以走到所有的边。(因为边是限制关系,一定要满足所有的限制关系,可以不走到所有的点,因为可能有孤立的点。但是通常可以走到所有的点就一定可以走到所有的边,但是可以走到所有的边未必能走到所有的点)

步骤:

1.先将每个不等式xi<=xj+ck转化成一条从xj走到xi,长度为ck的边

2.找一个超级源点,使得该源点一定可以遍历到所有边

3.从源点求一遍单源最短路

        结果1:如果存在负环,则原不等式组一定无解

        结果2:如果没有负环,则dist[i]就是原不等式组的一个可行解

如何求最大值或者最小值(这里的最值指的是每个变量的最值)

结论:如果是求最小值,则应该求最长路,如果是求最大值,则应该求最短路

问题:如果转化xi<=c(其中c是一个常数)

方法:建立一个超级源点,0,然后建立0到i,长度是c的边即可

ps:求最大值相当于求上界,若有多个上界,显然应该取小的那个,所以是最短路

求最小值是求下界,下界应该是最大的那个,所以是最长路。

方法就是这么个方法,我们来根据例题分析。

1169. 糖果(活动 - AcWing)

思路:差分约束类型的题目,首先就是要把不等式关系理清楚,这里求至少,那么应该求最长路,那么不等关系应该是x1>=x2+c的格式

x=1:a==b =>  a>=b+0,b>=a+0

x=2:a<b => b>=a+1

x=3:a>=b => a>=b+0

x=4:a>b => a>=b+1

x=5:a<=b => b>=a

如此就理出了明着给出的不等关系,但是我们发现没有一个点的值可以直接确定,我们得到的只是相对关系,那么该怎么办呢?这时候就需要找一个超级源点,从它可以遍历所有的边。题目中实际上暗含了一个条件,所有的小朋友都要有糖,那么就是x>=1,因为小朋友的编号是从1开始的,所以我们可以将超级原点定在0处,0到所有点建立一条边权为1的边,既然从0可以到所有的点了,那么也可以到所有的边了。问题自然解决。(实际上最开始将所有点的距离都赋成1,然后将所有点都加入也是可以的。)

这道题其实比较坑的还有一个点,就是需要判负环,但是判负环是会超时的,有一个优化就是将spfa中的队列改成栈。

#include<bits/stdc++.h>
using namespace std;
const int N = 100010, M = 300010;
int n,m;
int h[N],e[M],ne[M],w[M],idx;
long long d[N];
int st[N],cnt[N];
void add(int a,int b,int c)
{
    w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int spfa()
{
    stack<int>q;
    memset(d,-0x3f,sizeof d);
    d[0]=0;
    q.push(0);
    st[0]=1;
    while(q.size())
    {
        int t=q.top();
        q.pop();
        st[t]=0;
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]<d[t]+w[i])
            {
                d[j]=d[t]+w[i];
                cnt[j]=cnt[t]+1;
                if(cnt[j]>=n+1) return 0;
                if(!st[j]) st[j]=1,q.push(j);
            }
        }
    }
    return 1;
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    for(int i=1;i<=m;i++)
    {
        int x,a,b;
        scanf("%d%d%d",&x,&a,&b);
        if(x==1) add(b,a,0),add(a,b,0);
        else if(x==2) add(a,b,1);
        else if(x==3) add(b,a,0);
        else if(x==4) add(b,a,1);
        else if(x==5) add(a,b,0);
    }
    for(int i=1;i<=n;i++) add(0,i,1);
    if(!spfa()) printf("-1");
    else 
    {
        long long res=0;
        for(int i=1;i<=n;i++) res += d[i];
        cout<<res;
    }
}

362. 区间(362. 区间 - AcWing题库)

 思路:首先我们来理一下题意吧,其实第一遍看题目差点没看懂题目的意思。然后又仔细盘了一遍。题目是说,我们要从0到50000中选若干个数,给定一些区间[a,b],对于每个区间给定一个c,我们选出来的数需要满足至少有c个在区间[a,b]中。

这题乍一看跟差分约束没什么关系,实际上也有一个贪心的做法,但是还是有一个很巧妙的差分约束的思路的。我们从集合的角度来看,定义s[i]表示从1-i中选出了s[i]个数。那么就可以得到如下的不等式关系:

s[i]>=s[i-1]
s[i]-s[i-1]<=1
s[b]-s[a-1]>=c

求至少的话,应该求最长路,不等式应该形如:x1>=x2+c:

s[i]>=s[i-1]+0
s[i-1]>=s[i]-1
s[b]>=s[a-1]+c

不等式关系出来了,那么再找是否有一个超级原点可以到所有的边。

根据第一个不等式i-1到i,依次类推,0可以到所有的点,那么自然可以到所有的边,至此便可以套用差分约束的模板了。

另外由于我们要从0开始,但区间也是从0开始的,所以可以将所有的点往后挪一位。

#include<bits/stdc++.h>
using namespace std;
const int N=50010,M=3*N+10;//3种类型的边
int n;
int h[N],e[M],ne[M],w[M],idx;
int d[N],st[N];
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void spfa()
{
    memset(d,-0x3f,sizeof d);
    d[0]=0;
    queue<int>q;
    q.push(0);
    while(q.size())
    {
        int t=q.front();
        q.pop();
        st[t]=0;
        
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]<d[t]+w[i])
            {
                d[j]=d[t]+w[i];
                if(!st[j]) st[j]=1,q.push(j);
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    memset(h,-1,sizeof h);
    for(int i=1;i<N;i++) 
    {
        add(i-1,i,0);
        add(i,i-1,-1);
    }
    for(int i=0;i<n;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        a++,b++;
        add(a-1,b,c);
    }
   spfa();
   cout<<d[50001];
    
}

ps:由此可以看出差分约束的关键在于不等式和超级源点,这题的处理其实更像dp了。

1170. 排队布局(活动 - AcWing)

思路:这题还是有很多限制条件,所以我们由此推出一些不等式:
d[i-1]<=d[i](1-N排列)
a-b<=l
x-y>=d

要找符合要求的最大值,最大值就应该求最短路,那么不等式应该形如x1<=x2+c:

d[i-1]<=d[i]+0
a<=l+b(b<a)
y<=x-d(x>y)

由第一个条件很容易找到超级源点0,那么就可以套用差分约束的模板。

 不过这里还有一个地方需要注意,1到N的距离可以任意大,这个该如何判断呢。

实际上我们不用真正的把0放入队列,如果不成立,那么就有负环,我们可以跑一边spfa,这时候是将所有点都加入队列;如果没有负环,那么就要考虑从1开始找最短路,d[n]是否为正无穷,如果是正无穷,那么自然该输出-2,否则输出值即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=30010;
int n,m1,m2;
int h[N],e[M],ne[M],w[M],idx;
int d[N],st[N],cnt[N];
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool spfa(int size)
{
    memset(d,0x3f,sizeof d);
    memset(st,0,sizeof st);
    memset(cnt,0,sizeof cnt);
    queue<int>q;
    for(int i=1;i<=size;i++)
    {
        q.push(i);
        d[i]=0;
        st[i]=1;
    }
    while(q.size())
    {
         
        int t=q.front();
        q.pop();
        st[t]=0;
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]>d[t]+w[i])
            {
                d[j]=d[t]+w[i];
                cnt[j]=cnt[t]+1;
                if(cnt[j]>=n) return 0;
                if(!st[j])
                {
                    st[j]=1;
                    q.push(j);
                }
            }
        }
    }
    
    return 1;
}
int main()
{
    scanf("%d%d%d",&n,&m1,&m2);
    memset(h,-1,sizeof h);
    for(int i=1;i<n;i++) add(i+1,i,0);
    for(int i=1;i<=m1;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(a>b) swap(a,b);//并不能保证大小确定
        add(a,b,c);
    }
    for(int i=1;i<=m2;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(a>b) swap(a,b);
        add(b,a,-c);
    }
    if(!spfa(n)) printf("-1");
    else
    {
        spfa(1);
        if(d[n]==0x3f3f3f3f) printf("-2");
        else printf("%d",d[n]);
    }
}

393. 雇佣收银员(393. 雇佣收银员 - AcWing题库)

思路:这道题的实现同样比较巧妙,我们按照来的开始时间分类,分成24类,然后我们统计每一类种来的人为num[i],假设挑走x人,那么就可以得到不等式关系了:
x[i-1]<=x[i]
x[i]<=num[i]
x[i-7]+x[i-6]+...+x[i]>=r[i]

这里第二个式子显然不符合差分约束的要求,但是我们可以通过它联系到前缀和,定义s[i]表示从1-i每个开始时间挑选的人的总和。虽然题目说是从0开始,但是我们可以整体后移一位,变成1-24,因为要建立超级源点

那么上式:
s[i-1]<=s[i]
s[i]-s[i-1]<=num[i]
s[i]-s[i-8]>=r[i](i>=8)
s[i]+s[24]-s[16+i]>=r[i](i<=7)

求最少,计算最长路,不等式变成x1>=x2+ck:
s[i]>=s[i-1];
s[i-1]>=s[i]-num[i]
s[i]>=s[i-8]+r[i]
s[i]>=s[16+i]+r[i]-s[24];

注意到最后一个式子实际上还是不符合要求,有s[24]这一项,实际上我们可以枚举s[24],把它变成一个常量,那么问题就解决了。

#include<bits/stdc++.h>
using namespace std;
const int N=30,M=10010;
int h[N],e[M],ne[M],w[M],idx;
int r[N],num[N];
int n;
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void build(int u)
{
    memset(h,-1,sizeof h);
    idx=0;
    add(0,24,u);
    add(24,0,-u);
    for(int i=1;i<=24;i++) 
    {
        add(i-1,i,0);
        add(i,i-1,-num[i]);
        if(i>=8) add(i-8,i,r[i]);
        else add(16+i,i,r[i]-u);
    }
    
}
int d[N],st[N],cnt[N];
bool spfa(int u)
{
    build(u);
    memset(d,-0x3f,sizeof d);
    memset(st,0,sizeof st);
    memset(cnt,0,sizeof cnt);
    d[0]=0;
    queue<int>q;
    q.push(0);
    while(q.size())
    {
        int t=q.front();
        q.pop();
        st[t]=0;
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]<d[t]+w[i])
            {
                d[j]=d[t]+w[i];
                cnt[j]=cnt[t]+1;
                if(cnt[j]>=25) return 0;
                if(!st[j])
                {
                    st[j]=1;
                    q.push(j);
                }
            }
        }
    }
    return 1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        for(int i=1;i<=24;i++) scanf("%d",&r[i]);
        scanf("%d",&n);
        memset(num,0,sizeof num);
        for(int i=1;i<=n;i++)
        {
            int c;
            scanf("%d",&c);
            c++;
            num[c]++;
        }
        int flag=0;
        for(int i=0;i<=1000;i++)
        {
            if(spfa(i))
            {
                flag=1;
                break;
            }
        }
        if(flag) printf("%d\n",d[24]);
        else printf("No Solution\n");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1456893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion系列(六):原理剖析——从文字到图片的神奇魔法(潜空间篇)

文章目录 LDM概述原理模型架构自编码器模型扩散模型条件引导模型图像生成过程 实验结果指标定义IS&#xff08;越大越好&#xff09;FID&#xff08;越小越好&#xff09; 训练成本与采样质量分析不带条件的图片生成基于文本的图片生成基于语义框的图片生成基于语义图的图片生成…

金蝶云星空——用递归SQL查询物料分组

应用场景&#xff1a; 金蝶物料分组为树形结构&#xff0c;需要根据SQL查询同步到第三方系统中。 技术实现 用递归CTE按照树状结构展开物料分组 with cte as( select 0 as 物料分组层级,t1.FID,case when isnull(t1.FFULLPARENTID,) then .CAST(t1.FID AS VARCHAR(…

K8s进阶之路-核心概念/架构:

架构&#xff1a;Master/Node Master组件--主控节点{ 负责集群管理&#xff08;接收用户事件转化成任务分散到node节点上&#xff09;} Apiserver&#xff1a; 资源操作的唯一入口&#xff0c;提供认证、授权、API注册和发现等机制 Scheduler &#xff1a; 负责集群资源调度&am…

K8s进阶之路-安装部署K8s

参考&#xff1a;&#xff08;部署过程参考的下面红色字体文档链接就可以&#xff0c;步骤很详细&#xff0c;重点部分在下面做了标注&#xff09; 安装部署K8S集群文档&#xff1a; 使用kubeadm方式搭建K8S集群 GitBook 本机&#xff1a; master&#xff1a;10.0.0.13 maste…

三防工业平板丨亿道加固平板定制丨三防平板电脑丨提升后勤管理

企业的后勤管理对于运作高效的商业模式至关重要。随着科技的不断发展&#xff0c;加固平板成为提升企业后勤水平的一项关键措施。本文将探讨加固平板在企业后勤管理中的应用和优势&#xff0c;并阐述如何利用这一技术提升企业的运营效率和竞争力。 一、三防加固平板的定义和功能…

通用二进制方式安装MySQL8.0.x

一、必要说明 1、系统&#xff1a;openEuler操作系统 2、版本&#xff1a;MySQL - 8.0.36 3、下载地址&#xff1a;https://dev.mysql.com/get/Downloads/MySQL-8.0 二、安装步骤 1、下载glibc版本的Mysql [rootnode2 ~]# wget -c https://dev.mysql.com/get/Downloads/MySQ…

《乱弹篇(十六)知不言》

日本电影《我的男人》&#xff0c;是伦理情色类型片。故事讲述&#xff0c;一个小姑娘在地震后失去了亲人&#xff0c;她被远房亲戚&#xff08;一位消防员收养&#xff09;。 图&#xff1a;来源电影《我的男人》广告 两人一起生活&#xff0c;难免日久生情&#xff0c;于是便…

【Jvm】运行时数据区域(Runtime Data Area)原理及应用场景

文章目录 前言&#xff1a;Jvm 整体组成 一.JDK的内存区域变迁Java8虚拟机启动参数 二.堆0.堆的概念1.堆的内存分区2.堆与GC2.1.堆的分代结构2.2.堆的分代GC2.3.堆的GC案例2.4.堆垃圾回收方式 3.什么是内存泄露4.堆栈的区别5.堆、方法区 和 栈的关系 三.虚拟机栈0.虚拟机栈概念…

Redis系列学习文章分享---第一篇(Redis快速入门之初始Redis--NoSql+安装redis+客户端+常用命令)

目录 今天开始进入Redis系列学习分享1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启 1.4.Re…

防御保护--防火墙综合实验

防御保护--防火墙综合实验 一、实验需求二、实验配置1.配置IP地址及划分安全区域2.FW2和FW4组成主备模式的双机热备2.1 检查双机热备状态 3.DMZ区存在两台服务器&#xff0c;现在要求生产区的设备仅能在办公时间访问&#xff0c;办公区的设备全天都可以访问3.1 测试&#xff1a…

计算机专业必看的几部电影

计算机专业必看的几部电影 计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨头的创业之路&#xff0c;《源代码》带你穿越时间解救世界&#xff0c;…

区块链游戏解说: DeFi Kingdoms

数据源&#xff1a; DeFi Kingdoms Dashboard 作者&#xff1a;lesleyfootprint.network 编译&#xff1a;mingfootprint.network 什么是 DeFi Kingdoms DeFi Kingdoms 是一个跨链奇幻 RPG 游戏&#xff0c;拥有精美的像素艺术&#xff0c;将资源加密并与 DeFi 协议集成&am…

vue3 之 商城项目—封装SKU组件

认识SKU组件 SKU组件的作用 产出当前用户选择的商品规格&#xff0c;为加入购物车操作提供数据信息&#xff0c;在选择的过程中&#xff0c;组件的选中状态要进行更新&#xff0c;组件还要提示用户当前规格是否禁用&#xff0c;每次选择都要产出对应的sku数据 SKU组件的使用 …

每日学习总结20240219

每日总结 20240219 1.文件类型.csv CSV文件是一种以逗号分隔值&#xff08;Comma-Separated Values&#xff09;为标记的文本文件&#xff0c;它可以用来存储表格数据。每一行表示一条记录&#xff0c;而每一条记录中的字段则使用逗号或其他特定的分隔符进行分隔。 常用场景…

Linux第61步_“buildroot”构建根文件系统第3步_烧写根文件系统到EMMC中_并完善开发板配置

烧录到EMMC测试&#xff0c;还需进一步测试和配置。 1、删除rootfs”目录下的“rootfs.tar”压缩包 打开第1个终端 输入“ls回车” 输入“cd linux/回车”&#xff0c;切换到“linux”目录 输入“ls回车”&#xff0c;列出“linux”目录下的文件和文件夹 输入“cd nfs/回…

凌华科技USB-1902数据采集卡功能增强的经典应用DAQWare for USB1902

众所周知&#xff0c;TLA发布了一系列功能增强的基于多功能数据采集卡的课程实验套件。日前&#xff0c;该系列再添新新军DAQWare for USB-1902。该系列基于ADLINK(凌华科技)USB-1902&#xff0c;也适用JYTEK(简仪科技)USB-69102。 USB-1902简要参数&#xff1a; ■ USB2.0高速…

跟无神学AI之一文读尽Sora

openAI发布视频生成模型Sora&#xff0c;意味着人类距离AI模拟世界又近了一步&#xff0c;流浪地球2中数字人女儿也是对未来科技发展的一个缩影。 作为最具有代表性的大模型公司&#xff0c;openAI的任何一个产品都具有一定的价值&#xff0c;代表着AI的前沿发展方向。 博主今…

人工智能算法:推动未来的技术引擎

随着科技的飞速进步&#xff0c;人工智能(AI)已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶汽车&#xff0c;再到医疗和金融等领域&#xff0c;AI算法的应用正日益广泛。本文将带你深入了解人工智能算法的魅力、种类以及未来趋势&#xff0c;探讨它们如何推动…

林浩然与杨凌云的Java世界奇遇记:垃圾回收大冒险

林浩然与杨凌云的Java世界奇遇记&#xff1a;垃圾回收大冒险 The Java Adventure Chronicles of Lin Haoran and Yang Lingyun: Garbage Collection Odyssey 在一个充满0和1代码森林的世界里&#xff0c;住着两位勇敢的程序员侠侣——林浩然和杨凌云。林浩然是个身怀Java绝技的…

解决 jenkins 插件下载失败问题 配置 jenkins 插件中心为国内镜像地址

从 jenkins 官网上下载的 jenkins&#xff0c;在安装的过程中&#xff0c;会有安装插件一环&#xff1a; 第一个为默认安装&#xff0c;第二个为手动 选择默认安装之后&#xff0c;会遇到&#xff1a; 安装插件失败&#xff0c;或者卡在安装插件这个地方非常久&#xff0c;久…