ABC E求条
查看原帖
ABC E求条
741314
signed_long_long楼主2025/7/26 22:11
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define sky 0
int n,m,k;
const int N=505;
int dis[N][N];
int d[N];
int t;
bool flag[N];
signed main(){
    cin>>n>>m;
    memset(dis,0x3f,sizeof dis);
    for(int i=0;i<=n;i++) dis[i][i]=0;
    for(int i=1;i<=m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        dis[a][b]=dis[b][a]=c;
    }
    cin>>k>>t;
    int q;
    for(int i=1;i<=k;i++){
        cin>>d[i];
        dis[d[i]][sky]=t;
        dis[sky][d[i]]=0;
    }
    for(int k=0;k<=n;k++){
        for(int i=0;i<=n;i++){
            for(int j=0;j<=n;j++){
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
    }
    cin>>q;
    while(q--){
        int op;
        cin>>op;
        int x,y,T;
        if(op==1){
            cin>>x>>y>>T;
            if(dis[x][y]<T) continue;
            dis[x][y]=T;
            dis[y][x]=T;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(i==j) continue;
                    dis[i][j]=min(dis[i][j],dis[i][x]+dis[y][j]+T);
                    dis[j][i]=dis[i][j];
                }
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(i==j) continue;
                    dis[i][j]=min(dis[i][j],dis[i][y]+dis[i][j]+T);
                    dis[j][i]=dis[i][j];
                }
            }
        }else if(op==2){
            cin>>x;
            dis[x][sky]=t;
            dis[sky][x]=0;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(i==j) continue;
                    dis[i][j]=min(dis[i][j],dis[i][x]+dis[sky][j]+t);
                    dis[j][i]=dis[i][j];
                }
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(i==j) continue;
                    dis[i][j]=min(dis[i][j],dis[i][sky]+dis[x][j]);
                    dis[j][i]=dis[i][j];
                }
            }
        }else{
            int now=0;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
        // cout<<(dis[i][j]>1e15?-1:dis[i][j])<<" ";
                    if(i==j) continue;
                    if(dis[i][j]>1e18) continue;
                    now+=dis[i][j];
                }
        // puts("");
            }
            cout<<now<<"\n";
        }
    }
    return 0;
}

可能有亿点点长,所以悬赏2关

2025/7/26 22:11
加载中...