2 条题解
-
1
#include<bits/stdc++.h> using namespace std; #define int long long //开long long,避免数据过大 int n,m,f[40001],x,y; int read(){ //快速读入函数 int ans=0,f=1; char ch=getchar(); while(!isdigit(ch)){ f*=(ch=='-')?-1:1; ch=getchar(); } while(isdigit(ch)){ ans=ans*10+ch-'0'; ch=getchar(); } return ans*f; } struct op{ //定义一个结构体表示边的起点、终点和权值 int a,b,c; } e[100001]; int gz(const op &a,const op &b){ //按照边的权值从大到小排序 if(a.c>b.c)return 1; else return 0; } int find(int x){ //并查集的查找函数 return f[x]==x?x:f[x]=find(f[x]); } signed main(){ n=read(),m=read(); for(int i=1; i<=m; i++) //读入每条边的信息 e[i].a=read(),e[i].b=read(),e[i].c=read(); for(int i=1; i<=n*2; i++) //将每个点初始化为一个单独的连通块 f[i]=i; sort(e+1,e+m+1,gz); //对边进行排序 for(int i=1; i<=m; i++){ x=find(e[i].a); y=find(e[i].b); if(x==y){ //如果连接的两个点已经在同一个连通块中,则输出答案并结束程序 printf("%d\n",e[i].c); return 0; } f[y]=find(e[i].a+n); //否则将该边连接的两个连通块合并 f[x]=find(e[i].b+n); } puts("0"); //如果所有点都在同一个连通块中,则输出0 return 0; }
-
1
#include<bits/stdc++.h> using namespace std; struct H{ int a,b,c; }h[100010]; bool h_cmp(H x,H y){ return x.c>y.c; } int e[20010],pre[20010]; int find(int x){ if(x==pre[x]) return x; pre[x]=find(pre[x]); return pre[x]; } void join(int x,int y){ pre[find(x)]=find(y); } void initialize(){ for(int i=0;i<20010;i++) pre[i]=i; } int main(){ initialize(); int N,M; scanf("%d%d",&N,&M); for(int i=0;i<M;i++){ scanf("%d%d%d",&h[i].a,&h[i].b,&h[i].c); } sort(h,h+M,h_cmp); for(int i=0;i<M;i++){ if(find(h[i].a)==find(h[i].b)){ printf("%d\n",h[i].c); return 0; } if(e[h[i].a]==0) e[h[i].a]=h[i].b;//如果没有设置敌人,那么设置敌人 else{ join(h[i].b,e[h[i].a]); }//如果已经有敌人,那么b一定和a的敌人的敌人在同一组 if(e[h[i].b]==0) e[h[i].b]=h[i].a; else{ join(h[i].a,e[h[i].b]); } } printf("0\n"); return 0; }
- 1
信息
- ID
- 220
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 40
- 已通过
- 23
- 上传者