怎么优先队列优化
查看原帖
怎么优先队列优化
810354
liuye20100123楼主2023/12/23 22:43
#include<bits/stdc++.h>
using namespace std;
int n,p,c,u,v,w,a,minn,k;
int t[1005],to[2005],val[2005],nxt[2005],h[2005],cnt,dis[1005][1005],disn[1005],b[1005][1005];
priority_queue<int,vector<int>,greater<int> >q;
void add(int a,int b,int c)
{
    to[++cnt]=b;
    val[cnt]=c;
    nxt[cnt]=h[a];
    h[a]=cnt; 
}
int main()
{
    cin>>n>>p>>c;
    for(int i=1;i<=n;i++)
        cin>>a,t[a]++;
    for(int i=1;i<=c;i++)
    {
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    for(int l=1;l<=p;l++)
    {
        for(int i=1;i<=p;i++)
            dis[l][i]=0x3fffffff;
        dis[l][l]=0;
        q.push(l); 
        for(int i=1;i<=p;i++)
        {
            minn=0x3fffffff;
            k=0;
            for(int j=1;j<=p;j++)
            {
                if((!b[l][j])&&dis[l][j]<minn)
                {
                    minn=dis[l][j];
                    k=j;
                }
            }
            b[l][k]=1;
            if(k==0) break;
            for(int j=h[k];j;j=nxt[j])
            {
                dis[l][to[j]]=min(dis[l][k]+val[j],dis[l][to[j]]);
            }
        }
    }
    for(int i=1;i<=p;i++)
        for(int j=1;j<=p;j++)
            if(dis[j][i]!=0x3fffffff)
                disn[i]+=dis[j][i]*t[j];
    minn=0x7fffffff;
    for(int i=1;i<=p;i++)
    {
        if(disn[i]<minn)
            minn=disn[i];
    }
    printf("%d",minn);
    return 0;
}
2023/12/23 22:43
加载中...