一下是本蒟蒻认为近几年来NOIP提高组比较难的题目,神犇觉得太水请手动关闭:-)

 

TOP10 NOIP 2010 关押罪犯
主要考点:并查集

 开两倍并查集,f[i],f[j+n]表示i和j在不同的监狱。利
用a与b不在一个监狱,b与c不在一个监狱,则a与c必定
在一个监狱这一性质合并集合。

 1 #include<set>
 2 #include<map>
 3 #include<queue>
 4 #include<stack>
 5 #include<ctime>
 6 #include<cmath>
 7 #include<string>
 8 #include<vector>
 9 #include<cstdio>
10 #include<cstdlib>
11 #include<cstring>
12 #include<iostream>
13 #include<algorithm>
14 using namespace std;
15 struct data{
16   int a,b,w;
17 }e[100010];
18 int k[40010];
19 int cmp(const data &A,const data &B)
20 {
21   return A.w>B.w;
22 }
23 int find(int x)
24 {
25   if(k[x]==x) return x;
26   else {k[x]=find(k[x]);return k[x];}
27 }
28 int main()
29 {
30   int n,m;
31   scanf("%d%d",&n,&m);
32   for(int i=1;i<=m;i++)
33     scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w);
34   for(int i=1;i<=2*n;i++)
35     k[i]=i;
36   sort(e+1,e+m+1,cmp);
37   for(int i=1;i<=m;i++)
38     {
39       int p=find(e[i].a),q=find(e[i].b);
40       if(p==q) {printf("%d",e[i].w);return 0;}
41       k[p]=find(e[i].b+n),k[q]=find(e[i].a+n);
42     }
43   printf("0");
44   return 0;
45 }
View Code

相关文章:

  • 2022-02-02
  • 2021-11-16
  • 2021-07-04
  • 2022-12-23
  • 2021-11-09
  • 2021-06-24
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-28
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-25
  • 2021-06-13
相关资源
相似解决方案