1135. 新年好

  • 枚举访问\(5\)个亲戚顺序的全排列
  • 有了全排列后,现在缺少每个亲戚到其他亲戚的最短距离
  • 于是跑\(6\)\(dijkstra\)算法
const int N=50010;
vector<PII> g[N];
int dist[10][N];
bool vis[N];
int sta[10];
bool st[10];
int n,m;
int ans=INF;

void dijkstra(int u,int s)
{
    memset(dist[u],0x3f,sizeof dist[u]);
    memset(vis,0,sizeof vis);
    priority_queue<PII,vector<PII>,greater<PII> > heap;
    dist[u][s]=0;
    heap.push({0,s});

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

        if(vis[t]) continue;
        vis[t]=true;

        for(int i=0;i<g[t].size();i++)
        {
            int j=g[t][i].fi,w=g[t][i].se;
            if(dist[u][j] > dist[u][t] + w)
            {
                dist[u][j]=dist[u][t]+w;
                heap.push({dist[u][j],j});
            }
        }
    }
}

void dfs(int u,int last,int sum)
{
    if(sum >= ans) return;
    if(u > 5)
    {
        ans=min(ans,sum);
        return;
    }

    for(int i=1;i<=5;i++)
        if(!st[i])
        {
            st[i]=true;
            dfs(u+1,i,sum+dist[last][sta[i]]);
            st[i]=false;
        }
}

int main()
{
    ios;
    cin>>n>>m;

    for(int i=1;i<=5;i++) cin>>sta[i];

    while(m--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        g[a].pb({b,c});
        g[b].pb({a,c});
    }

    sta[0]=1;
    for(int i=0;i<=5;i++)
        dijkstra(i,sta[i]);

    dfs(1,0,0);

    cout<<ans<<endl;
    //system("pause");
}
posted @ 2020-09-27 07:53  Dazzling!  阅读(133)  评论(0编辑  收藏  举报