1345:【例4-6】香甜的黄油

    xiaoxiao2023-09-29  163

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[1600][1600]; bool flag[900]; int dis[900]; int w[1600][1600]; int b[900]; int num[1600]; int que[1600]; int maxx=0x7ffffff/3; int main() {     int n,p,q;     scanf("%d%d%d",&n,&p,&q);     for(int i=1;i<=n;i++)         scanf("%d",&b[i]);     int x,y,z;     for(int i=1;i<=q;i++)     {         scanf("%d%d%d",&x,&y,&z);         w[x][y]=w[y][x]=z;         a[x][++num[x]]=y;         a[y][++num[y]]=x;     }     int minn=0x7ffffff;     for(int i=1;i<=p;i++)     {         int h=0,t=1;         int ans=0;         memset(que,0,sizeof(que));         memset(flag,0,sizeof(flag));         for(int j=1;j<=p;j++)             dis[j]=maxx;         dis[i]=0;         flag[i]=1;         que[t]=i;         do         {             h++;             h=(h-1)00+1;             int u=que[h];             flag[u]=0;             for(int j=1;j<=num[u];j++)             {                 if(dis[u]+w[u][a[u][j]]<dis[a[u][j]])                 {                     dis[a[u][j]]=dis[u]+w[u][a[u][j]];                     {                         if(flag[a[u][j]]==0)                         {                             t++;                             t=(t-1)00+1;                             que[t]=a[u][j];                             flag[a[u][j]]=1;                             }                     }                                  }             }         }while(h!=t);         for(int j=1;j<=n;j++)             ans+=dis[b[j]];         minn=min(ans,minn);     }     printf("%d",minn);     return 0; }

    最新回复(0)