zoukankan      html  css  js  c++  java
  • 关押罪犯洛谷P1525

    题目+评测传送门
    思路

    其实这一题有2种不同的思路,但是由于我实在是太蒟蒻了,只会其中一种,另一种看了半天都不知道它在讲什么/(ㄒoㄒ)/~~

    首先,我们要学习一下二分图及其判断方法博客,然后这个题目就很好解决了,我们二分计算仇恨值,然后在如果2人仇恨值大于mid,我们就把他们相连,然后判断这个图是否是二分图,即在左右部分里面"没有冲突",而判断是否是二分图的方法,上面给的链接里面也讲了,然后这道题就OK啦

    代码
     1 #include<bits/stdc++.h>
     2 #define FOR(i,a,b) for(register int i=a;i<=b;i++)
     3 #define ll long long
     4 #define gc getchar();
     5 using namespace std;
     6 int n,m,maxx=0,num=0,ans;
     7 int head[20000+10];
     8 int colo[20000+10];
     9 struct s1
    10 {
    11     int fm,to,vl,nt;
    12 }a[2*100000+10];
    13 int scan()
    14 {
    15     int as=0,f=1;char c=gc;
    16     while(c>'9'||c<'0'){if(c=='-') f=-1;c=gc};
    17     while(c>='0'&&c<='9') {as=(as<<3)+(as<<1)+c-'0';c=gc};
    18     return as*f;
    19 }
    20 void ad(int fm,int to,int vl)
    21 {
    22     a[++num].nt=head[fm];
    23     a[num].fm=fm;a[num].to=to;a[num].vl=vl;
    24     head[fm]=num;
    25 }
    26 bool chek(int mid)
    27 {
    28     memset(colo,0,sizeof(colo));
    29     queue <int> q;
    30     FOR(i,1,n)
    31     {
    32         if(colo[i]) continue;
    33         q.push(i);colo[i]=1;//如果没有进入,随便进入一个坑,反正之前的都
    34 //已经解决完了
    35         while(!q.empty())
    36         {
    37             int u=q.front(); q.pop();
    38             for(int j=head[u];j;j=a[j].nt)
    39             {
    40                 if(a[j].vl>=mid)
    41                 {
    42                     if(colo[a[j].to]==0)
    43                     {
    44                         colo[a[j].to]=colo[u]==1?2:1;//对立面的颜色
    45                         q.push(a[j].to);
    46                     }
    47                     else if(colo[a[j].to]==colo[u]) return false;
    48                 }
    49             }    
    50         }
    51     }
    52     return true;
    53 }
    54 int main()
    55 {
    56     n=scan();m=scan();
    57     FOR(i,1,m)
    58     {
    59         int f,t,v;
    60         f=scan();t=scan();v=scan();
    61         maxx=max(v,maxx);
    62         ad(f,t,v);ad(t,f,v);
    63     }
    64     int l=0,r=maxx+1;
    65     while(l+1<r)
    66     {
    67         int mid=(l+r)>>1;
    68         if(chek(mid)) r=mid;
    69         else l=mid;
    70     }
    71     cout<<l;
    72     return 0;
    73 }
  • 相关阅读:
    WIN10下Java环境变量配置
    Oracle中用户的创建和权限设置
    Oracle表空间的创建与删除
    设置RHEL-7.0的运行级别
    发布项目到Tomcat(域名直接访问)
    centos7 打开80端口(网络搜集)
    MySql字符乱码问题解决(真)
    centos7安装workbench
    centos7添加Windows引导
    centos7下yum安装mysql(转)
  • 原文地址:https://www.cnblogs.com/KSTT/p/10368510.html
Copyright © 2011-2022 走看看