AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

AcWing 1135. 新年好

作者: 作者的头像   纳兰晚宁 ,  2021-01-18 16:39:54 ,  阅读 7


0


#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdio>

using namespace std;

typedef pair<int,int> PII;

const int N =50010,M=200010,INF=0x3f3f3f3f;
int n,m;
int h[N],e[M],ne[M],w[M],idx;
int q[N],dist[6][N];
int source[6];
bool st[N];

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

void dijkstra(int start,int dist[])
{
    memset(dist,0x3f,N*4);
    dist[start]=0;
    memset(st,0,sizeof st);

    priority_queue<PII,vector<PII>,greater<PII>> heap;
    heap.push({0,start});

    while(heap.size())
    {
        auto t=heap.top();
        heap.pop();

        int ver=t.second;
        if(st[ver])  continue;
        st[ver]=true;

        for(int i=h[ver];~i;i=ne[i])
        {
            int j=e[i];
            if(dist[j]>dist[ver]+w[i])
            {
                dist[j]=dist[ver]+w[i];
                heap.push({dist[j],j});
            }
        }
    }
}

int dfs(int u,int start,int distance)
{
    if(u>5)  return distance;

    int res=INF;
    for(int i=1;i<=5;i++)
       if(!st[i])
       {
           int next=source[i];
           st[i]=true;
           res=min(res,dfs(u+1,i,distance+dist[start][next]));
           st[i]=false;
       }
       return res;
}
int main()
{
    scanf("%d%d",&n,&m);
    source[0]=1;
    for(int i=1;i<=5;i++)  scanf("%d",&source[i]);

    memset(h,-1,sizeof h);
    while(m--)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c),add(b,a,c);
    }
    for(int i=0;i<6;i++) dijkstra(source[i],dist[i]);

    memset(st,0,sizeof st);
    printf("%d\n",dfs(1,0,0));

    return 0;
}

0 评论

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息