思路:
面包店一定和面粉店直接相连,所以贪心 从小到大排列通路长度,用vis[ ]记录访问面粉店,那么每条路如果一个被访问一个不被访问,就可以开面包店,更新最小距离就好。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL __int64
using namespace std;
int vis[100010];
struct node
{
LL x,y,l;
}a[100010];
bool cmp(node a,node b)//从小到大排列
{
return a.l<b.l;
}
int main()
{
int n,m,k;
LL x;
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++)
{
scanf("%I64d%I64d%I64d",&a[i].x,&a[i].y,&a[i].l);
}
sort(a,a+m,cmp);
for(int i=0;i<k;i++)
{
scanf("%I64d",&x);
vis[x]=1;
}
LL ans=1e10;
for(int i=0;i<m;i++)
{
if((vis[a[i].x]&&!vis[a[i].y])||(!vis[a[i].x]&&vis[a[i].y]))
ans=min(ans,a[i].l);
}
if(ans==1e10) //没有可连通的路
printf("-1\n");
else
printf("%I64d\n",ans);
return 0;
}

本文介绍了一个关于面包店选址的问题,目标是在避开已有的面粉储存城市的前提下,找到距离面粉店最近的城市开设新店,通过贪心算法结合路径长度排序实现解决方案。
636

被折叠的 条评论
为什么被折叠?



