本题 O(n^3) 玄学通过,有大佬来解释一下为啥吗?
查看原帖
本题 O(n^3) 玄学通过,有大佬来解释一下为啥吗?
544446
Demon_master楼主2022/11/16 23:13

code

// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef long double ld;
const ll maxn=1500+2;
 
inline ll read_int(){
	ll a=0;bool f=0;char g=getchar();
	while(g<'0'||g>'9') {if(g=='-') f=1;g=getchar();}
	while('0'<=g&&g<='9') a=a*10+g-'0',g=getchar();
	return f ? -a : a;
}
 
inline void write(ll a,bool f=1){
	char lin[40];ll top=0;
	if(a<0) a=-a,putchar('-');
	while(a) lin[++top]=a%10+'0',a/=10;
	if(!top) lin[++top]='0';
	while(top) putchar(lin[top--]);
	if(f) putchar('\n');
}

struct E{
    int t,n,v;
}edge[300000*2+32];
int l,head[maxn];
int n,m;
int X1,X2,Y1,Y2;

int dis[maxn];
inline void djsl(int s){
    memset(dis,0x3f,sizeof dis);
    dis[s]=0;
    priority_queue<pii> p;
    p.push({0,s});
    while(!p.empty()){
        int s=p.top().second;
        if(p.top().first+dis[s]) {p.pop();continue;}
        else p.pop();
        for(int i=head[s];i;i=edge[i].n){
            int t=edge[i].t;
            if(dis[t]>dis[s]+edge[i].v){
                dis[t]=dis[s]+edge[i].v;
                p.push({-dis[t],t});
            }
        }
    }
}

int du[maxn];bool vis[maxn];
inline void dfs_1(int s){
    if(vis[s]) return;
    vis[s]=1;
    for(int i=head[s];i;i=edge[i].n){
        int t=edge[i].t;
        if(dis[s]==dis[t]+edge[i].v){
            du[t]++;
            dfs_1(t);
        }
    }
}

int Dis[maxn][maxn];
inline void dfs_2(int s){
    for(int i=head[s];i;i=edge[i].n){
        int t=edge[i].t;
        if(dis[s]==dis[t]+edge[i].v){
            du[t]--;
            for(int e=1;e<=n;e++){
                if(e==t) continue;
                if(s==e) Dis[s][t]=edge[i].v;
                else if(Dis[e][s]) Dis[e][t]=Dis[e][s]+edge[i].v;
            }
            if(du[t]) continue;
            dfs_2(t);
        }
    }
}

bool can[maxn][maxn];
int ans=0;
inline void dfs_3(int s){
    for(int i=1;i<=n;i++){
        if(can[i][s]) ans=max(max(Dis[s][i],Dis[i][s]),ans);
    }
    for(int i=head[s];i;i=edge[i].n){
        int t=edge[i].t;
        if(dis[s]==dis[t]+edge[i].v){
            du[t]--;
            for(int e=1;e<=n;e++){
                if(e==t) continue;
                if(s==e) can[s][t]=1;
                else if(can[e][s]) can[e][t]=1;
            }
            if(du[t]) continue;
            dfs_3(t);
        }
    }
}

inline void read(){
    n=read_int(),m=read_int();
    X1=read_int(),Y1=read_int(),X2=read_int(),Y2=read_int();
    for(int i=1;i<=m;i++){
        int f=read_int(),t=read_int(),v=read_int();
        l++,edge[l]=(E){t,head[f],v},head[f]=l;
        l++,edge[l]=(E){f,head[t],v},head[t]=l;
    }
    djsl(X1);
    dfs_1(Y1);
    for(int i=1;i<=n;i++) vis[i]=0;
    dfs_2(Y1);
    djsl(X2);
    for(int i=1;i<=n;i++) vis[i]=0;
    dfs_1(Y2);
    dfs_3(Y2);
    write(ans);
}

int main (){
    // freopen(".in","r",stdin);
    read();
    // while(1) getchar();
}
2022/11/16 23:13
加载中...