三个re求调dijkstra+堆优化
查看原帖
三个re求调dijkstra+堆优化
1096562
lvhuanyu楼主2024/1/12 14:09
// Created by 小宇 on 2024/1/12.
//

#include <iostream>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
const int N=50010,M=400010;
int n,m;
int head[N],to[M],Next[M],W[M],cnt=1;
int list1[N];
int list2[8];
int all[8][8];
int ans=INF;
bool list3[8];

void dijkstra(int u){
    bool key[5010]={};
    int dis[5010];
    ::memset(dis,0x3f,sizeof dis);
    dis[u]=0;
    priority_queue<pair<int ,int>,vector<pair<int ,int>>,greater<pair<int ,int>>> Q;
    Q.push({0,u});
    while (!Q.empty()){
        auto node=Q.top();
        Q.pop();
        int k=node.second;
        key[k]= true;
        int temp=head[k];
        while (temp){
            int i=to[temp];
            if(key[i]){
                temp=Next[temp];
                continue;
            }
            if(dis[i]>dis[k]+W[temp]){
                dis[i]=dis[k]+W[temp];
                Q.push({dis[i],i});
            }
            temp=Next[temp];
        }
    }
    int temp=list1[u];
    for (int i = 1; i <=6 ; ++i) {
        all[temp][i]=dis[list2[i]];
    }
}

void DFS(int u,int s,int sum){
    if(sum>=ans){
        return;
    }
    if(s==5){
        ans=min(ans,sum);
        return;
    }
    for (int i = 1; i <=6 ; ++i) {
        if(i==u || list3[i])continue;
        list3[i]= true;
        DFS(i,s+1,sum+all[u][i]);
        list3[i]= false;
    }
}
void build(int u,int v , int w){
    W[cnt]=w;
    to[cnt]=v;
    Next[cnt]=head[u];
    head[u]=cnt;
    cnt++;
}


signed main(){
    ::scanf("%d%d",&n,&m);
    for (int i = 2; i <= 6; ++i) {
        int t;
        ::scanf("%d",&t);
        list1[t]=i;
        list2[i]=t;
    }
    list1[1]=1;
    list2[1]=1;
    for (int i = 0; i < m; ++i) {
        int u,v,w;
        ::scanf("%d%d%d",&u,&v,&w);
        build(u,v,w);
        build(v,u,w);
    }
    ::memset(all,0x3f,sizeof all);
    for (int i = 1; i <=6 ; ++i) {
        dijkstra(list2[i]);
    }
    list3[1]= true;
    DFS(1,0,0);
    ::printf("%d",ans);
    return 0;
}```
2024/1/12 14:09
加载中...