1 条题解

  • 0
    @ 2025-2-14 21:30:05

    C++ :

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    #define INF 0x3f3f3f3f
    using namespace std;
    const int N=801,E=14500;
    int cost[E],dist[N];
    int e,pnt[E],nxt[E],head[N],vis[N],cow[N];
    struct qnode{
        int v,c;
        qnode(int vv=0,int cc=0):v(vv),c(cc){}
        bool operator < (const qnode &r)const
        {
            return c>r.c;
        }
    };
    void Dijkstra(int n,const int src)
    {
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
            dist[i]=INF;
        qnode mv;
        int i,j,k,pre;
        priority_queue<qnode> que;
        vis[src]=1;
        dist[src]=0;
        que.push(qnode(src,0));
        for(pre=src,i=1;i<n;i++)
    	{
            for(j=head[pre];j!=-1;j=nxt[j])
    		{
                k=pnt[j];
                if(vis[k]==0&&dist[pre]+cost[j]<dist[k])
    			{
                    dist[k]=dist[pre]+cost[j];
                    que.push(qnode(pnt[j],dist[k]));
                }
            }
            while(!que.empty()&&vis[que.top().v]==1) que.pop();
            if(que.empty()) break;
            mv=que.top();
            que.pop();
            vis[pre=mv.v]=1;
        }
    }
    inline void addedge(int u,int v,int c)
    {
        pnt[e]=v;
        cost[e]=c;
        nxt[e]=head[u];
        head[u]=e++;
    }
    void init(int nv,int ne)
    {
        int i,u,v,c;
        e=0;
        memset(head,-1,sizeof(head));
        for(i=0;i<ne;i++)
    	{
            cin>>u>>v>>c;
            u--;v--;
            addedge(u,v,c);
            addedge(v,u,c);
    
        }
    }
    int main()
    {
        int p,n,m,i,j;
        while(scanf("%d%d%d",&p,&n,&m)!=EOF)
    	{
            for(i=0;i<p;i++)
                scanf("%d",&cow[i]);
            init(n,m);
            int minx=INF;
            for(i=0;i<n;i++)
    		{
                Dijkstra(n,i);
                int sum=0;
                for(j=0;j<p;j++)
                    sum+=dist[cow[j]-1];
                if(minx>sum)
                    minx=sum;
            }
            printf("%d\n",minx);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    947
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者