Unaccepted 100分
查看原帖
Unaccepted 100分
481471
Eric12楼主2023/8/3 16:31
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct data{
	int bh,zhi;
	friend bool operator <(data x,data y)
	{
		return x.zhi>y.zhi;
	}
};
struct line{
	int u,v,w,pre;
}l[2901];
int n,p,c,sum,ans=0x3f3f3f3f;
int niu[501],last[801],dis[801];
bool flag[801];
void dij(int start)
{
	memset(dis,0x3f,sizeof(dis));
	memset(flag,0,sizeof(flag));
	priority_queue<data> q;
	dis[start]=0;
	q.push({start,0});
	while(!q.empty())
	{
		int x=q.top().bh;
		q.pop();
		flag[x]=true;
		for(int i=last[x];i!=0;i=l[i].pre)
		{
			int zd=l[i].v;
			if(!flag[zd]&&dis[zd]>dis[x]+l[i].w)
			{
				dis[zd]=dis[x]+l[i].w;
				q.push({zd,dis[zd]});
			}
		}
	}
}
int main()
{
	cin>>n>>p>>c;
	for(int i=1;i<=n;i++)
		cin>>niu[i];
	for(int i=1,x,y,w;i<=c;i++)
	{
		cin>>x>>y>>w;
		l[i*2-1].u=x;
		l[i*2-1].v=y;
		l[i*2-1].w=w;
		l[i*2-1].pre=last[x];
		last[x]=i*2-1;
		l[i*2].u=y;
		l[i*2].v=x;
		l[i*2].w=w;
		l[i*2].pre=last[y];
		last[y]=i*2;
	}
	for(int i=1;i<=p;i++)
	{
		dij(i);
		sum=0;
		for(int j=1;j<=n;j++)
			if(dis[niu[j]]!=0x3f3f3f3f)sum+=dis[niu[j]];
		ans=min(ans,sum);
	}
	cout<<ans<<endl;
	return 0;
}

错了 Subtask1Subtask 1 的测试点

2023/8/3 16:31
加载中...