题意:

思路:这道题并没有官方题解

没有羊驼在所有三元组中出现就是NO

现在考虑不少于1只的情况

删去其中一只,我们得到了两组点和一些边

我们只要判断这是否为一张二分图,使用暴力染色的方法就有60分了

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define N 10010
  4. #define M 50010
  5. using namespace std;
  6. int T,n,m,edgenum,u,v,ok,isok,root;
  7. int f[N],vet[M],next[M],head[N],a[M],b[M],c[M],vis[N],flag[N],col[N];
  8. void add(int u,int v)
  9. {
  10. vet[++edgenum]=v;
  11. next[edgenum]=head[u];
  12. head[u]=edgenum;
  13. }
  14. void dfs(int u)
  15. {
  16. vis[u]=;
  17. for (int e=head[u];e;e=next[e])
  18. {
  19. int v=vet[e];
  20. if (flag[v]) continue;
  21. if (vis[v])
  22. {
  23. if (col[v]==col[u]) ok=;
  24. }else
  25. {
  26. col[v]=col[u]^;
  27. dfs(v);
  28. }
  29. }
  30. }
  31. int main()
  32. {
  33. freopen("river.in","r",stdin);
  34. freopen("river.out","w",stdout);
  35. scanf("%d",&T);
  36. while (T--)
  37. {
  38. scanf("%d%d",&n,&m);
  39. for (int i=;i<=n;i++) f[i]=;
  40. for (int i=;i<=m;i++)
  41. {
  42. scanf("%d%d%d",&a[i],&b[i],&c[i]);
  43. f[a[i]]++;f[b[i]]++;f[c[i]]++;
  44. }
  45. root=-;
  46. for (int i=;i<=n;i++) if (f[i]==m) root=i;
  47. if (root==-){puts("no");continue;}
  48. edgenum=;
  49. for (int i=;i<=n;i++) head[i]=;
  50. for (int i=;i<=m;i++)
  51. {
  52. if (a[i]==root){u=b[i];v=c[i];}
  53. if (b[i]==root){u=a[i];v=c[i];}
  54. if (c[i]==root){u=a[i];v=b[i];}
  55. //ed[i].x=u;ed[i].y=v;
  56. add(u,v);add(v,u);
  57. }
  58. isok=;
  59. //printf("%d\n",root);
  60. for (int i=;i<=n;i++) if (i!=root)
  61. {
  62. if (isok) break;
  63. for (int j=i+;j<=n;j++) if (j!=root)
  64. {
  65. //printf("%d %d\n",i,j);
  66. for (int k=;k<=n;k++) vis[k]=col[k]=;
  67. flag[i]=flag[j]=;
  68. ok=;
  69. for (int k=;k<=n;k++) if (!vis[k]&&k!=i&&k!=j&&k!=root)
  70. dfs(k);
  71. if (ok) isok=;
  72. flag[i]=flag[j]=;
  73. if (isok) break;
  74. }
  75. }
  76. if (isok) puts("yes");else puts("no");
  77. }
  78. }

至于标程……谁看得懂呢……貌似是暴力加了点优化……

  1. #include<bits/stdc++.h>
  2. #define FT first
  3. #define SC second
  4. #define PB push_back
  5. #define MP make_pair
  6. #define REP(i, l, r) for(int i = (l); i <= (r); i++)
  7. #define PER(i, r, l) for(int i = (r); i >= (l); i--)
  8. #define FOR(i, n) for(int i = 0; i < (n); i++)
  9. #define ROF(i, n) for(int i = (n) - 1; i >= 0; i--)
  10. #define VEP(i, x) for(int i = 0; i < x.size(); i++)
  11. #define DFOR(i, x, y) for(int i = hd[x], y = e[i].to; i; i = e[i].nxt, y = e[i].to)
  12. #define MEM(a, b) memset(a, b, sizeof(a))
  13. #define rint read<int>()
  14. #define rll read<LL>()
  15.  
  16. using namespace std;
  17. typedef long long LL;
  18. typedef long double LD;
  19. typedef pair<int, int> PI;
  20. const int inf = 0x7fffffff;
  21. const int MOD = ;
  22.  
  23. template <typename tn>
  24. inline tn read(){
  25. char ch; tn f = ;
  26. while (!isdigit(ch = getchar())) if (ch == '-') f = -;
  27. tn x = ch - '';
  28. while (isdigit(ch = getchar())) x = x * + ch - '';
  29. return x * f;
  30. }
  31. template <typename tn> inline void cmax(tn &a, tn b){ if (a < b) a = b; }
  32. template <typename tn> inline void cmin(tn &a, tn b){ if (a > b) a = b; }
  33.  
  34. const int N = + ;
  35. struct Edge{ int nxt, to; } e[N * ];
  36. struct Data{ int f, safe, danger; };
  37. int color[N], x[N], y[N], z[N], sz[N], rt, tail, hd[N], tot, dep[N], S, T;
  38. void add(int x, int y){ e[++tail] = (Edge){hd[x], y}, hd[x] = tail; }
  39. Data dfs(int x, int c, int f){
  40. color[x] = c;
  41. Data cur;
  42. cur.safe = inf, cur.danger = -, cur.f = ;
  43. DFOR(i, x, y) if (y != f && color[y] != -)
  44. if (!~color[y]){
  45. dep[y] = dep[x] + ;
  46. Data now = dfs(y, c ^ , x);
  47. cur.f += now.f; if (cur.f > ) { return cur;}
  48. cmin(cur.safe, now.safe), cmax(cur.danger, now.danger);
  49. } else if (dep[y] < dep[x]) if (color[x] ^ color[y]) cmin(cur.safe, dep[y]); else{
  50. cmax(cur.danger, dep[y]);
  51. if (!S) S = x, T = y;
  52. if (S != x && S != y) S = -;
  53. if (T != x && T != y) T = -;
  54. }
  55. if (cur.safe <= dep[x] && cur.danger >= dep[x]) cur.f = ;
  56. else if (cur.danger >= dep[x]) cur.f++, cur.danger = -;
  57. return cur;
  58. }
  59. int main(){
  60. freopen("river.in", "r", stdin);
  61. freopen("river.out", "w", stdout);
  62. int Cas = rint;
  63. while (Cas--){
  64. int n = rint, m = rint;
  65. MEM(sz, ), MEM(hd, ), tail = , rt = ;
  66. REP(i, , m) sz[x[i] = rint]++, sz[y[i] = rint]++, sz[z[i] = rint]++;
  67. REP(i, , n) if (sz[i] == m) rt = i;
  68. if (rt){
  69. bool ans = ;
  70. REP(i, , m){
  71. if (x[i] == rt) swap(x[i], z[i]);
  72. if (y[i] == rt) swap(y[i], z[i]);
  73. add(x[i], y[i]), add(y[i], x[i]);
  74. }
  75. REP(i, , n) if (i != rt) {
  76. MEM(color, -), color[i] = -;
  77. int flag = , tot = ;
  78. REP(i, , n) if (color[i] == -){
  79. S = , T = ;
  80. int tmp = dfs(i, , ).f;
  81. if (S > || T > ) cmin(tmp, );
  82. tot += tmp;
  83. if (tot > ) {flag = ; break;}
  84. }
  85. if (flag) {ans = ; break;}
  86. }
  87. if (ans) printf("yes\n"); else printf("no\n");
  88. } else printf("no\n");
  89. }
  90. }

【ZJOI2017 Round1练习】D2T1 river(二分图)的更多相关文章

  1. BZOJ1143 [CTSC2008]祭祀river 二分图匹配 最小链覆盖

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1143 题意概括 给出一个有向图.求最小链覆盖. 题解 首先说两个概念: 链:一条链是一些点的集合, ...

  2. 【ZJOI2017 Round1后记】

    2017.4.1: NOIP+Round1综合成绩出来,标准分离续命线差了80分,果然还是联赛坑挖太大了…… 不管怎么说能续命的话还是要试一下的…… 发毒誓:Round2前不打手游,不看NGA,不看星 ...

  3. [图论训练]1143: [CTSC2008]祭祀river 二分图匹配

    Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在 水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...

  4. 【ZJOI2017 Round1练习&BZOJ4765】D1T3 普通计算姬(主席树,分块)

    题意: 思路:分块 使用树状数组维护sum[i]的前缀和 使用主席树维护root到u的路径上点的编号出现的个数 每次操作如果是修改就加入队列 如果是询问,考虑块内操作对询问的影响,每次在x点加上y会使 ...

  5. 【ZJOI2017 Round1练习】D2T2 iqtest(排列组合)

    题意: 思路: 根据欧拉定理,a^(phi(n)-1)为a mod n的逆元 ..]of longint; s,ans,x,mo,k,phi,tmp:int64; i,m,n,j:longint; f ...

  6. 【ZJOI2017 Round1练习】D2T3 counter(线段树)

    题意: 思路: 预处理出b[i]代表i位置之前比a[i]小的数的个数 以每个数为结尾的组数是线段树中(1,a[i]-1) 对于a[i]换到最后,相当于线段树中(a[i]+1,n)-- 交换后b[i]又 ...

  7. 【ZJOI2017 Round1练习&BZOJ4767】D1T3 两双手(排列组合,DP)

    题意: 100%的数据:|Ax|,|Ay|,|Bx|,|By| <= 500, 0 <= n,Ex,Ey <= 500 思路:听说这是一道原题 只能往右或者下走一步且有禁止点的简化版 ...

  8. 【ZJOI2017 Round1练习&BZOJ4766】D1T2 文艺计算姬(Prufer编码)

    题意:给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图K_{n,m},求其生成树个数 mod p. 100%的数据:1 <= n,m,p <= 10^18 思路:这是 ...

  9. 【ZJOI2017 Round1练习】

    喜闻乐见(爆蛋滚粗)的ZJOI模拟赛终于开始了 可以又一次感受被屠的快感 DAY1: T1:线段树打错-70 正解分块听卡常还要调块的大小 T2:数学弱爆 是道结论题 T3:暴力分滚粗 DAY2: T ...

随机推荐

  1. synchronize早已经没那么笨重

    我发现一些同学在网络上有看不少synchronize的文章,可能有些同学没深入了解,只看了部分内容,就急急忙忙认为不能使用它,很笨重,因为是采用操作系统同步互斥信号量来实现的.关于这类的对于synch ...

  2. 031_spark架构原理

    spark核心组件 driver master worker executor task(只有task是线程) 核心组件的原理图解

  3. 如何处理Docker的错误消息request canceled:Docker代理问题

    在本地安装Kubernetes时,遇到错误消息: request canceled while waiting for connection(Client.Timeout exceeded while ...

  4. Window.Event.KeyCode的含义

    Window.Event.KeyCode=13的含义(转载) 2011-04-16 09:41:18|  分类: html |  标签:keycode  event  realkey  var  do ...

  5. 用python+pygame写贪吃蛇小游戏

    因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...

  6. ElasticSearch的常用方法

    关键词  cluster  集群  shards  索引分片    replicas  索引的副本    recovery  数据重新分布 gateway  索引的持久化方式 Transport 交互 ...

  7. react中的jsx详细理解

    这是官网上的一个简单的例子 const name = 'Josh Perez'; const element = <h1>Hello, {name}</h1>; ReactDO ...

  8. No-5.远程管理常用命令

    远程管理常用命令 目标 关机/重启 shutdown 查看或配置网卡信息 ifconfig ping 远程登录和复制文件 ssh scp 01. 关机/重启 序号 命令 对应英文 作用 01 shut ...

  9. onPullDownRefresh函数没有被正确执行

    原因 问题原因很多,我遇到的这个问题的原因是: 页面有两个同名的onPullDownRefresh函数,导致只执行最后的一个. 解决 只留一个onPullDownRefresh函数

  10. nginx发布web网站

    修改/conf/nginx.conf配置文件 server { listen *:; # Listen server_name ""; # Don't worry if " ...