2 条题解

  • 1
    @ 2023-6-22 0:16:05
    #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
      @ 2023-6-21 8:57:13
      #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
      上传者