社区讨论
TLE最后一个点求助
P2046[NOI2010] 海拔参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi6oasyk
- 此快照首次捕获于
- 2025/11/20 08:08 4 个月前
- 此快照最后确认于
- 2025/11/20 08:08 4 个月前
蒟蒻卡不过时限,麻烦dalao看看怎么优化一下qwq
CPP#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int n,xx;
int s,t;
long long dis[500050];
int inque[500050];
int we[550][550],ew[550][550],ns[550][550],sn[550][550];
int q[7000500],st=0,ed=0;
struct data{
int to,nxt,val;
}mp[2200100];
int head[500050],cnt;
void link(int x,int y,int w)
{
mp[++cnt].to=y;
mp[cnt].nxt=head[x];
head[x]=cnt;
mp[cnt].val=w;
}
void spfa()
{
memset(dis,0x3f,sizeof(dis));
int ma=7000001;
q[++ed]=s;inque[s]=1;
dis[s]=0;
int v;
while(st!=ed)
{
st++;
st%=ma;
v=q[st];
for(int i=head[v];i;i=mp[i].nxt)
{
int x=mp[i].to;
if(dis[v]+mp[i].val<dis[x])
{
dis[x]=dis[v]+mp[i].val;
if(!inque[x])
{
ed++;
ed%=ma;
q[ed]=x,inque[x]=1;
}
}
}
inque[v]=0;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n+1;++i)
for(int j=1;j<=n;++j)scanf("%d",&we[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=n+1;++j)scanf("%d",&ns[i][j]);
for(int i=1;i<=n+1;++i)
for(int j=1;j<=n;++j)scanf("%d",&ew[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=n+1;++j)scanf("%d",&sn[i][j]);
s=n*n+3;t=s+1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
xx=n*(i-1);
if(i==1)
link(j,t,we[i][j]),
link(t,j,ew[j][i]);
if(j==1)
link(s,xx+j,ns[i][j]),
link(xx+j,s,sn[i][j]);
if(j==n)
link(xx+j,t,ns[i][n+1]),
link(t,xx+j,sn[i][n+1]);
if(i==n)
link(s,xx+j,we[n+1][j]),
link(xx+j,s,ew[n+1][j]);
if(i!=1)
link(xx+j,n*(i-2)+j,we[i][j]);
if(i!=n)
link(xx+j,n*i+j,ew[i+1][j]);
if(j!=n)
link(xx+j,xx+j+1,ns[i][j+1]);
if(j!=1)
link(xx+j,xx+j-1,sn[i][j]);
}
spfa();
printf("%lld\n",dis[t]);
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...