网易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;
}
#网易##笔试题目#

查看8道真题和解析