关于本题做法的疑问
查看原帖
关于本题做法的疑问
1029900
YuYuanPQ楼主2024/5/7 19:33

题目要求的点是 0∼N−10 \sim N-1。(如果这样打)第一份代码 WA 了 22 个点。

但是如果代码里,改成 1∼N1 \sim N,就不会 WA 了。

(输入的 t[i]t[i] 编号从 1∼N1 \sim N。而每次输入的点 +1+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;
}
2024/5/7 19:33
加载中...