题号:1525
参见题解:作者: 超级范范 更新时间: 2017-07-23 17:05
https://www.luogu.org/wiki/show?name=%E9%A2%98%E8%A7%A3+P1525
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int father[40005];
struct s{
int u, v, w;
bool operator < (s & s1){
return w>s1.w;
}
}arr[100005];
int _find(int node){
if (father[node] == -1)return node;
return father[node] = _find(father[node]);
}
void merge(int x, int y){
x = _find(x);
y = _find(y);
if (x != y)father[x] = y;
}
bool sameset(int x, int y){
return _find(x) == _find(y);
}
int main(){
memset(father, -1, sizeof(father));
ios::sync_with_stdio(false);
int n, m;
cin >> n >> m;
for (int i = 1; i <= m; i++){
cin >> arr[i].u >> arr[i].v >> arr[i].w;
}
sort(arr + 1, arr + m + 1);
int maxw = 0;
for (int i = 1; i <= m; i++){
if (sameset(arr[i].u, arr[i].v)){
if (arr[i].w > maxw){
cout << arr[i].w;
return 0;
}
}
else{
merge(arr[i].u, arr[i].v + n);
merge(arr[i].v, arr[i].u + n);
}
}
cout << 0;
} |
20180814更新:除了并查集做法还有二分图做法,应该也很好做,不写了。
题解:https://www.luogu.org/blog/Kesdiael3/solution-p1525
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include<iostream>
#include<algorithm>
using namespace std;
int n,m;
struct p{
int a,b,c;
bool operator < (const p& p2) const{
return c>p2.c;
}
}ps[100005];
int father[40005];
int _find(int x){
if(father[x]==0)return x;
return father[x]=_find(father[x]);
}
bool _union(int x,int y){
if(_find(x)==_find(y))return false;
father[_find(x)]=_find(y);
return true;
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>ps[i].a>>ps[i].b>>ps[i].c;
sort(ps+1,ps+m+1);
for(int i=1;i<=m;i++){
if(_find(ps[i].a)==_find(ps[i].b)){
cout<<ps[i].c;
return 0;
}else{
_union(ps[i].a,ps[i].b+n);
_union(ps[i].b,ps[i].a+n);
}
}
cout<<0;
} |