新年好(Dijkstra+dfs/全排列)

1135. 新年好 - AcWing题库

思路: 1.先预处理出1,a,b,c,d,e到其他点的单源最短路,也就是进行6次Dijkstra

2.计算以1为起点的这6个数的全排列,哪种排列方式所得距离最小,也可以使用dfs

1.Dijkstra+dfs

cpp 复制代码
#define int long long

using namespace std;

typedef pair<int,int> PII;

constexpr int N =2e5+5;
int dist[6][N];
bool st[50005];
int n,m,h[N],w[N],ne[N],e[N],idx;
int rela[N];
int ans;

void add(int a,int b,int c)
{
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}

void Dijkstra(int s, int dist[])
{
    memset(dist, 0x3f, N*4);//int是4字节,所以大小就是4*N
    memset(st,0,sizeof st);
    dist[s]=0;
    priority_queue<PII,vector<PII>,greater<PII>> heap;
    heap.push({0,s});
    while(heap.size())
    {
        auto [c,t] = heap.top();heap.pop();
        if(st[t]) continue;
        st[t]=true;
        for(int i=h[t];~i;i=ne[i])
        {
            int j=e[i];
            if(dist[j]>c+w[i])
            {
                dist[j]=c+w[i];
                heap.push({dist[j],j});
            }
        }
    }
}

int dfs(int u,int num,int dis) 
{
        if (num==6)
        {
            return dis;
        }
        int ret=0x3f3f3f3f;
        for (int i=1;i<=5;i++)
        {
            if (!st[i])
            {
                st[i] = 1;
                ret = min(ret,dfs(i,num+1,dis+dist[u][rela[i]]));
                st[i] = 0;
            }
        }
        return ret;
}

void solve()
{
    cin>>n>>m;
    rela[0]=1;
    for(int i=1;i<=5;i++)
    {
      cin>>rela[i];
    }
   
    memset(h,-1,sizeof h);
    while(m--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c),add(b,a,c);
    }
    for(int i=0;i<=5;i++)
    {
      Dijkstra(rela[i],dist[i]);
    }
    memset(st,false,sizeof st);
    cout<<dfs(0,1,0);
}

int32_t main()
{
   int t;//cin>>t;
   t=1;
   while(t--) solve();
}

2.Dijkstra+全排列

cpp 复制代码
#define int long long

using namespace std;

typedef pair<int,int> PII;

constexpr int N =2e5+5;
int dist[6][N];
bool st[50005];
int n,m,h[N],w[N],ne[N],e[N],idx;
int rela[N],order[6];
int ans;

void add(int a,int b,int c)
{
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}

void Dijkstra(int s, int dist[])
{
    memset(st,0,sizeof st);
    dist[s]=0;
    priority_queue<PII,vector<PII>,greater<PII>> heap;
    heap.push({0,s});
    while(heap.size())
    {
        auto [c,t] = heap.top();heap.pop();
        if(st[t]) continue;
        st[t]=true;
        for(int i=h[t];~i;i=ne[i])
        {
            int j=e[i];
            if(dist[j]>c+w[i])
            {
                dist[j]=c+w[i];
                heap.push({dist[j],j});
            }
        }
    }
}


void solve()
{
    memset(dist,0x3f,sizeof dist);
    cin>>n>>m;
    order[0]=0;rela[0]=1;
    for(int i=1;i<=5;i++)
    {
        order[i]=i;
      cin>>rela[i];
    }
   
    memset(h,-1,sizeof h);
    while(m--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c),add(b,a,c);
    }
    for(int i=0;i<=5;i++)
    {
      Dijkstra(rela[i],dist[i]);
    }
    memset(st,false,sizeof st);
    ans=0x3f3f3f3f;
    do{
        if(order[0]!=0) break;
        int sum=dist[0][rela[order[1]]];
        for(int i=1;i+1<=5;i++)
            sum+=dist[order[i]][rela[order[i+1]]];
        ans=min(ans,sum);
     }while(next_permutation(order,order+6));
    cout<<ans;
}

int32_t main()
{
   int t;//cin>>t;
   t=1;
   while(t--) solve();
}
相关推荐
程序员-King.43 分钟前
day158—回溯—全排列(LeetCode-46)
算法·leetcode·深度优先·回溯·递归
月挽清风2 小时前
代码随想录第七天:
数据结构·c++·算法
小O的算法实验室2 小时前
2026年AEI SCI1区TOP,基于改进 IRRT*-D* 算法的森林火灾救援场景下直升机轨迹规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小郭团队2 小时前
2_1_七段式SVPWM (经典算法)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·硬件架构·arm·dsp开发
充值修改昵称3 小时前
数据结构基础:从二叉树到多叉树数据结构进阶
数据结构·python·算法
Deepoch3 小时前
Deepoc数学大模型:发动机行业的算法引擎
人工智能·算法·机器人·发动机·deepoc·发动机行业
浅念-3 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
Hcoco_me4 小时前
大模型面试题84:是否了解 OpenAI 提出的Clip,它和SigLip有什么区别?为什么SigLip效果更好?
人工智能·算法·机器学习·chatgpt·机器人
BHXDML4 小时前
第九章:EM 算法
人工智能·算法·机器学习
却道天凉_好个秋5 小时前
目标检测算法与原理(三):PyTorch实现迁移学习
pytorch·算法·目标检测