AT E TLE 求优化思路
  • 板块学术版
  • 楼主__liujy
  • 当前回复11
  • 已保存回复11
  • 发布时间2025/7/26 21:41
  • 上次更新2025/7/27 12:38:35
查看原帖
AT E TLE 求优化思路
1657369
__liujy楼主2025/7/26 21:41

rt。

#include<bits/stdc++.h>
const int MAXN=505;
typedef long long LL;
const LL INF=1e15;
int n,m,k,d[MAXN],Q;
bool ok[MAXN];
LL T,dis[MAXN][MAXN];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            dis[i][j]=INF;
    for(int i=1;i<=n;i++) dis[i][i]=0;
    LL w;
    for(int _=1,u,v;_<=m;_++)
    {
        scanf("%d%d%lld",&u,&v,&w);
        dis[u][v]=dis[v][u]=std::min(dis[u][v],w);
    }
    scanf("%d%d",&k,&T);
    for(int i=1;i<=k;i++) scanf("%d",&d[i]);
    for(int i=1;i<=k;i++) ok[d[i]]=1;
    for(int i=1;i<=n;i++)
    {
        if(!ok[i]) continue;
        for(int j=1;j<=n;j++)
        {
            if(!ok[j]) continue;
            dis[i][j]=std::min(dis[i][j],T);
        }
    }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dis[i][j]=std::min(dis[i][j],dis[i][k]+dis[k][j]);
    scanf("%d",&Q);
    LL t;
    for(int _=1,op,x,y;_<=Q;_++)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d%d%lld",&x,&y,&t);
            if(t>=dis[x][y]) continue;
            dis[x][y]=t;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    dis[i][j]=std::min(dis[i][j],dis[i][x]+dis[y][j]+t),
                    dis[i][j]=std::min(dis[i][j],dis[i][y]+dis[x][j]+t);
        }
        else if(op==2)
        {
            scanf("%d",&x);
            if(ok[x]) continue;
            ok[x]=1;
            for(int i=1;i<=n;i++)
            {
                if(!ok[i]) continue;
                else if(T>=dis[x][i]) continue;
                dis[x][i]=dis[i][x]=T;
                for(int a=1;a<=n;a++)
                    for(int b=1;b<=n;b++)
                        dis[a][b]=std::min(dis[a][b],dis[a][x]+dis[i][b]+T),
                        dis[a][b]=std::min(dis[a][b],dis[a][i]+dis[x][b]+T);
            }
        }
        else if(op==3)
        {
            LL ans=0;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    if(dis[i][j]!=INF)
                        ans+=dis[i][j];
            printf("%lld\n",ans);
        }
    }
    return 0;
}

回复请 at 我。

2025/7/26 21:41
加载中...