CH6202 Árbol de expansión del camino más corto del castillo oscuro

Si no hay bordes de peso negativos, considere el problema del aumento monótono de la longitud del camino .

Después de recorrer el camino más corto, coloque los puntos en orden de acuerdo con la distancia desde 1. De esta forma, se puede unificar el orden, y los puntos siguientes deben estar conectados a los puntos anteriores.

Agregar un punto al árbol de expansión de ruta mínima en realidad no tiene nada que ver con su forma específica, basta con juzgar directamente si se puede pegar detrás del punto anterior. Y no importa dónde se publique (todos los cargos legales).

¡Preste atención a la inicialización de la ruta a INF!

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i<(b);i++)
#define lep(i,a,b) for(int i=(a);i>=(b);i--) 
#define lepp(i,a,b) for(int i=(a);i>(b);i--)
#define pii pair<int,int>
#define pll pair<long long,long long>
#define mp make_pair
#define All(x) x.begin(),x.end() 
#define ms(a,b) memset(a,b,sizeof(a)) 
#define INF 0x3f3f3f3f
#define INFF 0x3f3f3f3f3f3f3f3f
#define multi int T;scanf("%d",&T);while(T--) 
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e3+5;
const ll mod=(1LL<<31)-1;
const db eps=1e-6;                                                                            
const db pi=acos(-1.0);
int vis[N],dis[N],n,m,tr[N][N],gr[N];
bool cmp(const int &i,const int &j){
    return dis[i]<dis[j];
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("D:\\work\\data.in","r",stdin);
    #endif
    ms(tr,INF);//不要忘了初始化
    cin>>n>>m;
    rep(i,1,m){
        int u,v,w;
        cin>>u>>v>>w;
        tr[u][v]=tr[v][u]=w;
    }
    ms(dis,INF);
    dis[1]=0;
    priority_queue<pii>q;
    q.push(mp(0,1));
    while(q.size()){
        int cur=q.top().second;
        q.pop();
        if(vis[cur]) continue;
        vis[cur]=1;
        rep(i,1,n){
            if(vis[i]==0&&tr[cur][i]+dis[cur]<dis[i]){
                dis[i]=tr[cur][i]+dis[cur];
                q.push(mp(-dis[i],i));
            }
        }
    }
    rep(i,1,n) gr[i]=i;
    sort(gr+1,gr+n+1,cmp);
    ll ans=1;
    rep(i,2,n){
        ll tmp=0;
        rep(j,1,i-1)
            if(dis[gr[j]]+tr[gr[j]][gr[i]]==dis[gr[i]]) 
                ++tmp;
        ans=ans*tmp%mod;
    }
    cout<<ans<<endl;
}

 

Supongo que te gusta

Origin blog.csdn.net/Luowaterbi/article/details/112973378
Recomendado
Clasificación