分层图最短路求助!!!85pts 大片RE,WA在subtask 2上4个点
查看原帖
分层图最短路求助!!!85pts 大片RE,WA在subtask 2上4个点
581928
jasonliujiahua楼主2023/8/23 17:57
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int n,m,k,cnt,ans,a[maxn],d[maxn*5],c[maxn*5],b[maxn*5][5];
vector<int> s[maxn*5];
struct BFS
{
    int id,dis;
};
struct SPFA
{
    int id,a1,a2,a3,a4;
};
struct node
{
    int u,v,w,nxt;
}e[maxn*5];
int head[maxn*5];
bool vis[maxn<<1],is[maxn*5];
queue<int> q;
void add(int x,int y,int z)
{
    e[++cnt].u=x;
    e[cnt].v=y;
    e[cnt].w=z;
    e[cnt].nxt=head[x];
    head[x]=cnt;
}
void init()
{
    cin>>n>>m>>k;
    for(int i=2;i<=n;i++) cin>>a[i];
    a[0]=a[n];
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        s[x].push_back(y);
        s[y].push_back(x);
    }
    for(int i=1;i<=5*n;i++) 
        for(int j=1;j<=4;j++) b[i][j]=-1;
}
inline int calc(int x,int id)
{
    return (x-1)*n+id;
}
void build(int u,int v)
{
    // cout<<"build: "<<u<<" "<<v<<endl;
    for(int i=1;i<=5;i++)
    {
        if(v==1 && i!=5) continue;
        int j=i%5+1;
        int x=calc(i,u),y=calc(j,v);
        // is[x][y]=1;
        if(y==1) is[x]=1;
        // cout<<i<<" "<<j<<endl;
        add(x,y,a[v]);
        // printf("%d(%d) --> %d(%d) :  %d -----> %d  %d\n",
        // u,i,v,j,x,y,a[v]);
        // cout<<u<<"()"<<<<" ---> "<<v<<" :  "<<calc(i,u)<<" ----> "<<calc(j,v)<<endl;
    }
}
void bfs()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) vis[j]=0;
        queue<BFS> q1;
        q1.push((BFS){i,-1});
        vis[i]=1;
        while(!q1.empty())
        {
            int u=q1.front().id,w=q1.front().dis;
            q1.pop();
            if(w==k) break;
            for(int j=0;j<s[u].size();j++)
            {
                int v=s[u][j];
                if(vis[v]) continue;
                vis[v]=1;
                if(v!=i) build(i,v);
                q1.push((BFS){v,w+1});
            }
        }
    }
}
void spfa()
{
    for(int i=1;i<=n;i++) vis[i]=0;
    q.push(1);
    vis[1]=1;
    d[1]=0;
    while(!q.empty())
    {
        int u=q.front();
        // int u=q.front().id;
        // int b1=q.front().a1,b2=q.front().a2,b3=q.front().a3,b4=q.front().a4;
        q.pop();
        // cout<<b1<<" "<<b2<<" "<<b3<<" "<<b4<<" "<<endl;
        vis[u]=0;
        if(c[u]==4)
        {
            if(is[u])
            {
                // cout<<"update:  "<<b1<<" "<<b2<<" "<<b3<<" "<<b4<<": "<<d[u]<<endl;
                // ans=max(ans,a[b1]+a[b2]+a[b3]+a[b4]);
                ans=max(ans,d[u]);
            }
            continue;
        }
        for(int i=head[u];i;i=e[i].nxt)
        {
            int v=e[i].v;
            if(b[u][1]==v%n || b[u][2]==v%n || b[u][3]==v%n || b[u][4]==v%n) continue;
            if(d[v]<d[u]+e[i].w)
            {
                d[v]=d[u]+e[i].w;
                c[v]=c[u]+1;
                int x=-1;
                for(int j=1;j<=4;j++) 
                {
                    b[v][j]=b[u][j];
                    if(b[v][j]==-1 && x==-1) x=j;
                }
                b[v][x]=v%n;
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    cout<<ans<<endl;
}
void test()
{
    for(int i=1;i<=5;i++)
    {
        for(int j=1;j<=n;j++)
        {
            int x=calc(i,j);
            printf("d: %d(%d)(%d) = %d\n",x,i,j,d[x]);
        }
    }
}
int main()
{
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    init();
    bfs();
    spfa();
    // test();
    return 0;
}
2023/8/23 17:57
加载中...