【题目】
题目描述:
迅雷是广大群众喜闻乐见的下载软件,迅雷的工作原理也非常简单。
我们将网络简化为一个无向图,每一条边都有一个带宽 A 。有一些节点上有 WSY 放视频资源的服务器,有一些节点是你的电脑(你是壕)。作为下载软件,你需要找到一条连通放有资源的服务器之一和你电脑之一的道路,尽量使路径上带宽的最小值最大,这样你就能拥有最大的下载速度。
现在,全人类看片的任务就落在你头上了!
输入格式:
第一行两个数 n , m n,m n,m 表示有 n n n 个节点, m m m 条边
接下来一行一个数 y y y 表示你的电脑的个数
接下来一行 y y y 个数表示你的电脑所在节点
接下来 m m m 行,每行一个 s s s, t t t, w w w 表示这条边连接 s s s 号和 t t t 号节点,带宽为 w w w,节点从 1 1 1 标号
接下来一个数 p p p,表示有 p p p 个节点有 WSY 放视频的服务器
接下来一行 p p p 个数,表示 WSY 放视频的服务器所在节点编号。
输出格式:
输出一行为路径带宽最小值的最大值。
若你的电脑和 WSY 放资源的服务器位于同一节点,则输出 +00
样例数据:
输入
4 5
2
1 2
1 2 1
2 3 1
3 4 2
2 4 3
1 3 4
1
3
输出
4
提示:
10 % 10\% 10% 的数据, n , m , p ≤ 100 n,m,p \le 100 n,m,p≤100
另有 20 % 20\% 20% 的数据, n , m , p ≤ 1000 n,m,p \le1000 n,m,p≤1000
另有 10 % 10\% 10% 的数据, p = 1 p = 1 p=1
100 % 100\% 100% 的数据, n , m ≤ 100000 ; p , y ≤ n ; w ≤ 1 0 9 n,m\le100000;p,y\le n;w\le10^9 n,m≤100000;p,y≤n;w≤109
【分析】
这道题其实很简单,并没有自己想象中那么难
把所有边按照边权从大到小排序,然后按这个顺序一个一个加边,直到一台电脑与服务器连接
那怎么判断有没有电脑与服务器相连呢?可以用带权并查集
把电脑赋为 1 1 1,服务器是 2 2 2,其它的是 0 0 0,每次合并两个并查集的时候就或一下,若值为 3 3 3,则有电脑与服务器相连
那么最后加进来的边权就是答案了
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
using namespace std;
int n,m,t,y,p;
int a[N],b[N],mark[N],check[N],father[N];
struct edge
{
int u,v,w;
}e[N];
bool operator<(const edge &p,const edge &q){return p.w>q.w;}
int find(int x)
{
if(father[x]==x) return x;
return father[x]=find(father[x]);
}
int Merge(int x,int y)
{
x=find(x),y=find(y);
if(x!=y) father[y]=x,check[x]|=check[y];
return check[x];
}
void solve()
{
int i;
sort(e+1,e+m+1);
for(i=1;i<=n;++i)
father[i]=i;
for(i=1;i<=m;++i)
{
if(Merge(e[i].u,e[i].v)==3)
{
printf("%d",e[i].w);
break;
}
}
}
int main()
{
// freopen("thunder.in","r",stdin);
// freopen("thunder.out","w",stdout);
int x,y,z,i;
scanf("%d%d%d",&n,&m,&y);
for(i=1;i<=y;++i)
{
scanf("%d",&a[i]);
mark[a[i]]=1;
check[a[i]]=1;
}
for(i=1;i<=m;++i)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
scanf("%d",&p);
for(i=1;i<=p;++i)
{
scanf("%d",&b[i]);
check[b[i]]=2;
if(mark[b[i]]){puts("+00");return 0;}
}
solve();
// fclose(stdin);
// fclose(stdout);
return 0;
}