题目要求的点是 0∼N−1。(如果这样打)第一份代码 WA 了 2 个点。
但是如果代码里,改成 1∼N,就不会 WA 了。
(输入的 t[i] 编号从 1∼N。而每次输入的点 +1)
求问:为什么会 WA?
猜测与堆优 Dij 有关。
#include<bits/stdc++.h>
#define mkp make_pair
#define II pair<int,int>
#define ll long long
#define MAXN 1000
using namespace std;
int n,m,Q;
vector<pair<int,int>>path[MAXN];
bool bp[MAXN][MAXN];
int dis[MAXN],cnt;
int nxt[MAXN],head[MAXN],to[MAXN],val[MAXN];
int t[MAXN];
bool vis[MAXN];
priority_queue<II,vector<II>,greater<II>>q;
vector<int>dys[10010];
int nt;
void add(int x,int y,int z)
{
nxt[++cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
val[cnt]=z;
}
void reset()
{
//memset(dis,0x3f,sizeof(dis));
for(int i=0;i<=n;i++) vis[i]=0,dis[i]=0x3f3f3f3f;
}
int dij(int st,int ed)
{
dis[st]=0;
q.push(mkp(0,st));
while(q.size())
{
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=nxt[i])
{
int v=to[i];
if(dis[u]+val[i]<dis[v])
{
dis[v]=dis[u]+val[i];
q.push(mkp(dis[v],v));
}
}
}
if(dis[ed]!=0x3f3f3f3f) return dis[ed];
else return -1;
}
void build(int days)
{
for(int i=0;i<dys[days].size();i++)
{
int x=dys[days][i];
for(int j=0;j<path[x].size();j++)
{
int y=path[x][j].first;
int z=path[x][j].second;
if(t[x]>days||t[y]>days) continue;
if(!bp[x][y]&&!bp[y][x])
{
add(x,y,z);
add(y,x,z);
bp[x][y]=1;
bp[y][x]=1;
}
}
}
return;
}
int main()
{
freopen("rebuild.in","r",stdin);
freopen("rebuild.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&t[i]),dys[t[i]].push_back(i);
for(int i=1;i<=m;i++)
{
int x=0,y=0,z=0;
scanf("%d%d%d",&x,&y,&z);
path[x].push_back(mkp(y,z));
path[y].push_back(mkp(x,z));
}
build(0);
scanf("%d",&Q);
//nt=-1;
while(Q--)
{
int x,y,td;
scanf("%d%d%d",&x,&y,&td);
if(td>nt)
{
for(int day=nt+1;day<=td;day++)
{
build(day);
}
nt=td;
}
if(t[x]>nt||t[y]>nt)
{
printf("-1\n");
}
else
{
reset();
printf("%d\n",dij(x,y));
}
}
return 0;
}
#include<bits/stdc++.h>
#define mkp make_pair
#define II pair<int,int>
#define ll long long
#define MAXN 10000
using namespace std;
int n,m,Q;
vector<pair<int,int>>path[MAXN];
bool bp[MAXN][MAXN];
int dis[MAXN],cnt;
int nxt[MAXN],head[MAXN],to[MAXN],val[MAXN];
int t[MAXN];
bool vis[MAXN];
priority_queue<II,vector<II>,greater<II>>q;
vector<int>dys[10010];
int nt;
void add(int x,int y,int z)
{
nxt[++cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
val[cnt]=z;
}
void reset()
{
//memset(dis,0x3f,sizeof(dis));
for(int i=0;i<=n;i++) vis[i]=0,dis[i]=0x3f3f3f3f;
}
int dij(int st,int ed)
{
dis[st]=0;
q.push(mkp(0,st));
while(q.size())
{
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=nxt[i])
{
int v=to[i];
if(dis[u]+val[i]<dis[v])
{
dis[v]=dis[u]+val[i];
q.push(mkp(dis[v],v));
}
}
}
if(dis[ed]!=0x3f3f3f3f) return dis[ed];
else return -1;
}
void build(int days)
{
for(int i=0;i<dys[days].size();i++)
{
int x=dys[days][i];
for(int j=0;j<path[x].size();j++)
{
int y=path[x][j].first;
int z=path[x][j].second;
if(t[x]>days||t[y]>days) continue;
if(!bp[x][y]&&!bp[y][x])
{
add(x,y,z);
add(y,x,z);
bp[x][y]=1;
bp[y][x]=1;
}
}
}
return;
}
int main()
{
freopen("rebuild.in","r",stdin);
freopen("rebuild.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&t[i]),dys[t[i]].push_back(i);
for(int i=1;i<=m;i++)
{
int x=0,y=0,z=0;
scanf("%d%d%d",&x,&y,&z);
x++;
y++;
path[x].push_back(mkp(y,z));
path[y].push_back(mkp(x,z));
}
build(0);
scanf("%d",&Q);
//nt=-1;
while(Q--)
{
int x,y,td;
scanf("%d%d%d",&x,&y,&td);
x++;
y++;
if(td>nt)
{
for(int day=nt+1;day<=td;day++)
{
build(day);
}
nt=td;
}
if(t[x]>nt||t[y]>nt)
{
printf("-1\n");
}
else
{
reset();
printf("%d\n",dij(x,y));
}
}
return 0;
}