网易4.21普通技术笔试T3T4

#include<bits/stdc++.h>
using namespace std;
long long dp[100005][5];
int vis[100005];
struct node
{
    int x;
    int y;
    int z;
};
vector<node>q[100005];
void spfa(int x)
{
    queue<int>nh;
    nh.push(x);
    vis[x]=1;
    while(!nh.empty())
    {
        int now=nh.front();
        nh.pop();
        vis[now]=0;
        int len=q[now].size();
        for(int i=0; i<len; i++)
        {
            if(q[now][i].z==0)
            {
                int to=q[now][i].x;
                int val=q[now][i].y;
                if(dp[to][0]>dp[now][0]+val)
                {
                    dp[to][0]=dp[now][0]+val;
                    if(vis[to]=1)
                    {
                        nh.push(to);
                        vis[to]=1;
                    }
                }
                if(dp[to][1]>dp[now][1]+val)
                {
                    dp[to][1]=dp[now][1]+val;
                    if(vis[to]=1)
                    {
                        nh.push(to);
                        vis[to]=1;
                    }
                }
            }
            else
            {
                int to=q[now][i].x;
                int val=q[now][i].y;
                if(dp[to][1]>dp[now][0]+val)
                {
                    dp[to][1]=dp[now][0]+val;
                    if(vis[to]=1)
                    {
                        nh.push(to);
                        vis[to]=1;
                    }
                }
            }
        }
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        q[x].push_back({y,z,0});
        q[y].push_back({x,z,1});
    }
    for(int i=2; i<=n; i++)
    {
        dp[i][1]=1e18;
        dp[i][0]=1e18;
    }
    spfa(1);
    if(min(dp[n][0],dp[n][1])==1e18) printf("-1\n");
    else printf("%lld\n",min(dp[n][0],dp[n][1]));
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
int n,m,h;
int solve(int x,int y,int z)
{
    return (n*m)*(z-1)+(x-1)*m+y;
}
bool check(int x,int y,int z)
{
    if(x<=0||x>n) return 0;
    if(y<=0||y>m) return 0;
    if(z<=0||z>h) return 0;
    return 1;
}
int a[200005];
int now;
int fa[200005];
int nh[200005];
int modify[200005][5];
int vis[200005];
int dir[6][3]= {1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
void dfs(int x,int y,int z,int num)
{
    vis[solve(x,y,z)]=1;
    fa[solve(x,y,z)]=num;
    for(int i=0; i<6; i++)
    {
        int xx=x+dir[i][0];
        int yy=y+dir[i][1];
        int zz=z+dir[i][2];
        if(check(xx,yy,zz)&&vis[solve(xx,yy,zz)]==0&&a[solve(xx,yy,zz)]==0)
        {
            dfs(xx,yy,zz,num);
        }
    }
    return ;
}
int f(int x)
{
    while(fa[x]!=x)
    {
        x=fa[x]=fa[fa[x]];
    }
    return x;
}
int main()
{
    scanf("%d%d%d",&n,&m,&h);
    for(int i=1; i<=n*m*h; i++)
    {
        fa[i]=i;
    }
    int k;
    scanf("%d",&k);
    for(int i=1; i<=k; i++)
    {
        scanf("%d%d%d",&modify[i][1],&modify[i][2],&modify[i][3]);
        if(a[solve(modify[i][1],modify[i][2],modify[i][3])]==1)
        {
            nh[i]=1;
        }
        a[solve(modify[i][1],modify[i][2],modify[i][3])]=1;
    }
    vector<int>ans;
    now=0;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            for(int k=1; k<=h; k++)
            {
                if(vis[solve(i,j,k)]==0&&a[solve(i,j,k)]==0)
                {
                    dfs(i,j,k,solve(i,j,k));
                    now++;
                }
            }
        }
    }
    ans.push_back(now);
    for(int i=k; i>=2; i--)
    {
        if(nh[i]==1)
        {
            ans.push_back(now);
        }
        else
        {
            //printf("*********");
            a[solve(modify[i][1],modify[i][2],modify[i][3])]=0;
            vector<int>bza;
            for(int j=0; j<6; j++)
            {
                int xx=modify[i][1]+dir[j][0];
                int yy=modify[i][2]+dir[j][1];
                int zz=modify[i][3]+dir[j][2];
                if(check(xx,yy,zz)&&a[solve(xx,yy,zz)]==0)
                {
                    bza.push_back(f(solve(xx,yy,zz)));
                }
            }
            int len=bza.size();
            if(len==0) now++,fa[solve(modify[i][1],modify[i][2],modify[i][3])]=solve(modify[i][1],modify[i][2],modify[i][3]);
            else
            {
                map<int,int>q;
                for(int j=1; j<len; j++)
                {
                    if(q[bza[j]]==0&&bza[j]!=bza[0])
                    {
                        now--;
                        fa[bza[j]]=fa[bza[0]];
                        q[bza[j]]=1;
                    }
                }
                fa[solve(modify[i][1],modify[i][2],modify[i][3])]=bza[0];
            }
            ans.push_back(now);
        }
    }
    int len=ans.size();
    for(int i=len-1; i>=0; i--)
    {
        printf("%d\n",ans[i]);
    }
    return 0;
}

#网易##笔试题目#
全部评论
有兄弟贴下第三题题目吗?当时想到是Dij算法,但是Dij有点忘了就没做,去干第四题了,虽然也没干出来。现在想做做~感谢!
2 回复 分享
发布于 2022-04-22 11:13
换数字那道题有好的方法吗,暴力解40%
点赞 回复 分享
发布于 2022-04-21 21:09
第三题,我每次把一条有向边变为无向边,再用dijikstra求,只过了20
1 回复 分享
发布于 2022-04-21 21:44
大佬太强了
点赞 回复 分享
发布于 2022-04-21 21:04
可以讲下第四题思路吗
点赞 回复 分享
发布于 2022-04-21 21:15
第三题我直接从1开始dijistra,再反向建边从n开始dijistra,枚举每条边,没毛病呀,怎么就过20%
点赞 回复 分享
发布于 2022-04-21 21:17
大佬可以简单介绍一下思路吗?太菜了,有点看不懂,感谢感谢~~
点赞 回复 分享
发布于 2022-04-21 21:22
分享一下T2: long[] data, n, p, x long count = 0; long sum = 0; for (long num: data){       sum+=num; } for ( int i = 0; i < data.length; i++){       long othersSum = sum - data[i];       long a = otherSum % x;       long b = (x - a) % x;       count += (p + a) / x;        if (data[i] % x == b && data[i] <= p){              count--;    //不能包含原数字       } } return count;
点赞 回复 分享
发布于 2022-04-21 22:27
你这spfa怎么是 if(vis[to]=1)?
点赞 回复 分享
发布于 2022-04-21 22:30
兄弟这个if(vis[to]=1)是啥?应该是!=?
点赞 回复 分享
发布于 2022-04-22 08:54
您好,题目可以说下吗?源点和目标点是哪个,不太记得了
点赞 回复 分享
发布于 2022-04-22 11:09
学习了!感谢大佬
点赞 回复 分享
发布于 2022-04-22 13:10

相关推荐

01-23 19:12
门头沟学院 Java
榨出爱国基因:你还差 0.1% 就拿到校招礼盒,快叫朋友给你砍一刀吧
投递拼多多集团-PDD等公司8个岗位
点赞 评论 收藏
分享
02-13 14:30
四川大学 Java
Java抽象带篮子:简历怎么写可以看看我发的帖子,你先照着优化下简历吧
点赞 评论 收藏
分享
评论
7
18
分享

创作者周榜

更多
牛客网
牛客企业服务