CF707B

题目简化和分析:

这题看着玄胡很水实际。

我们需要做什么?

  • 只需对每个工厂周围的面包店遍历一遍打擂台取最小
  • 注意只对面包店遍历,所以对工厂设标记
  • 如果打完擂台发现 \(ans=inf\) 则说明全是工厂

Solution:

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N=1e5+50;

int n,m,k;

struct edge{
	int to,dis,next;
}e[N<<1];

int head[N<<1],a[N],cnt;

void add_edge(int u,int v,int w){
	++cnt;
	e[cnt].to=v;
	e[cnt].dis=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}
bool vis[N];
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;++i){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add_edge(u,v,w);
		add_edge(v,u,w);
	}
	for(int i=1;i<=k;++i){
		scanf("%d",&a[i]);
		vis[a[i]]=1;
	}
	int ans=INT_MAX;
	for(int i=1;i<=k;++i){
		for(int j=head[a[i]];j;j=e[j].next){
			int y=e[j].to;
			if(vis[y]) continue;
			ans=min(ans,e[j].dis);
		}
	}
	printf("%d\n",ans==INT_MAX?-1:ans);
}
posted @ 2022-08-06 15:07  RVG  阅读(34)  评论(0)    收藏  举报