题意:

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

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

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

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

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

 #include<cstdio>
#include<algorithm>
#define N 10010
#define M 50010
using namespace std;
int T,n,m,edgenum,u,v,ok,isok,root;
int f[N],vet[M],next[M],head[N],a[M],b[M],c[M],vis[N],flag[N],col[N];
void add(int u,int v)
{
vet[++edgenum]=v;
next[edgenum]=head[u];
head[u]=edgenum;
}
void dfs(int u)
{
vis[u]=;
for (int e=head[u];e;e=next[e])
{
int v=vet[e];
if (flag[v]) continue;
if (vis[v])
{
if (col[v]==col[u]) ok=;
}else
{
col[v]=col[u]^;
dfs(v);
}
}
}
int main()
{
freopen("river.in","r",stdin);
freopen("river.out","w",stdout);
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) f[i]=;
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
f[a[i]]++;f[b[i]]++;f[c[i]]++;
}
root=-;
for (int i=;i<=n;i++) if (f[i]==m) root=i;
if (root==-){puts("no");continue;}
edgenum=;
for (int i=;i<=n;i++) head[i]=;
for (int i=;i<=m;i++)
{
if (a[i]==root){u=b[i];v=c[i];}
if (b[i]==root){u=a[i];v=c[i];}
if (c[i]==root){u=a[i];v=b[i];}
//ed[i].x=u;ed[i].y=v;
add(u,v);add(v,u);
}
isok=;
//printf("%d\n",root);
for (int i=;i<=n;i++) if (i!=root)
{
if (isok) break;
for (int j=i+;j<=n;j++) if (j!=root)
{
//printf("%d %d\n",i,j);
for (int k=;k<=n;k++) vis[k]=col[k]=;
flag[i]=flag[j]=;
ok=;
for (int k=;k<=n;k++) if (!vis[k]&&k!=i&&k!=j&&k!=root)
dfs(k);
if (ok) isok=;
flag[i]=flag[j]=;
if (isok) break;
}
}
if (isok) puts("yes");else puts("no");
}
}

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

 #include<bits/stdc++.h>
#define FT first
#define SC second
#define PB push_back
#define MP make_pair
#define REP(i, l, r) for(int i = (l); i <= (r); i++)
#define PER(i, r, l) for(int i = (r); i >= (l); i--)
#define FOR(i, n) for(int i = 0; i < (n); i++)
#define ROF(i, n) for(int i = (n) - 1; i >= 0; i--)
#define VEP(i, x) for(int i = 0; i < x.size(); i++)
#define DFOR(i, x, y) for(int i = hd[x], y = e[i].to; i; i = e[i].nxt, y = e[i].to)
#define MEM(a, b) memset(a, b, sizeof(a))
#define rint read<int>()
#define rll read<LL>() using namespace std;
typedef long long LL;
typedef long double LD;
typedef pair<int, int> PI;
const int inf = 0x7fffffff;
const int MOD = ; template <typename tn>
inline tn read(){
char ch; tn f = ;
while (!isdigit(ch = getchar())) if (ch == '-') f = -;
tn x = ch - '';
while (isdigit(ch = getchar())) x = x * + ch - '';
return x * f;
}
template <typename tn> inline void cmax(tn &a, tn b){ if (a < b) a = b; }
template <typename tn> inline void cmin(tn &a, tn b){ if (a > b) a = b; } const int N = + ;
struct Edge{ int nxt, to; } e[N * ];
struct Data{ int f, safe, danger; };
int color[N], x[N], y[N], z[N], sz[N], rt, tail, hd[N], tot, dep[N], S, T;
void add(int x, int y){ e[++tail] = (Edge){hd[x], y}, hd[x] = tail; }
Data dfs(int x, int c, int f){
color[x] = c;
Data cur;
cur.safe = inf, cur.danger = -, cur.f = ;
DFOR(i, x, y) if (y != f && color[y] != -)
if (!~color[y]){
dep[y] = dep[x] + ;
Data now = dfs(y, c ^ , x);
cur.f += now.f; if (cur.f > ) { return cur;}
cmin(cur.safe, now.safe), cmax(cur.danger, now.danger);
} else if (dep[y] < dep[x]) if (color[x] ^ color[y]) cmin(cur.safe, dep[y]); else{
cmax(cur.danger, dep[y]);
if (!S) S = x, T = y;
if (S != x && S != y) S = -;
if (T != x && T != y) T = -;
}
if (cur.safe <= dep[x] && cur.danger >= dep[x]) cur.f = ;
else if (cur.danger >= dep[x]) cur.f++, cur.danger = -;
return cur;
}
int main(){
freopen("river.in", "r", stdin);
freopen("river.out", "w", stdout);
int Cas = rint;
while (Cas--){
int n = rint, m = rint;
MEM(sz, ), MEM(hd, ), tail = , rt = ;
REP(i, , m) sz[x[i] = rint]++, sz[y[i] = rint]++, sz[z[i] = rint]++;
REP(i, , n) if (sz[i] == m) rt = i;
if (rt){
bool ans = ;
REP(i, , m){
if (x[i] == rt) swap(x[i], z[i]);
if (y[i] == rt) swap(y[i], z[i]);
add(x[i], y[i]), add(y[i], x[i]);
}
REP(i, , n) if (i != rt) {
MEM(color, -), color[i] = -;
int flag = , tot = ;
REP(i, , n) if (color[i] == -){
S = , T = ;
int tmp = dfs(i, , ).f;
if (S > || T > ) cmin(tmp, );
tot += tmp;
if (tot > ) {flag = ; break;}
}
if (flag) {ans = ; break;}
}
if (ans) printf("yes\n"); else printf("no\n");
} else printf("no\n");
}
}

【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. TensorFlow 安装 Win10 Python+GPU

    前叙:有灵魂的程序都是每一个程序员的最终目标.TensorFlow了解下? 打算花几个月学机器学习,TensorFlow是很好的选择,折腾了会环境,略有心得分享下. 环境:win10 Python:3 ...

  2. 主成分分析、因子分析、ICA(未完成)

    并且SVD分解也适用于一般的矩阵. 主成分分析可以简单的总结成一句话:数据的压缩和解释.常被用来寻找判断某种事物或现象的综合指标,并且给综合指标所包含的信息以适当的解释.在实际的应用过程中,主成分分析 ...

  3. 20道必须掌握的C++面试题

    20道必须掌握的C++面试题 在面试C++方面的工作时,经常会遇到各种面试题,这对应聘人员的知识掌握能力要求较高.本文将为大家带来的就是20道必须掌握的C++面试题,不要错过哦! 问1:请用简单的语言 ...

  4. 基于纯注解的spring开发的介绍

    几个核心注解的介绍1.@Configuration它的作用是:将一个java类修饰为==配置文件==,在这个java类进行组件注册1package com.kkb.config; import org ...

  5. python⽤户登陆

    ⽤户登陆(三次输错机会)且每次输错误时显示剩余错误次数(提示:使⽤字符串格式化) count = 3 while count < 4: count -= 1 username = input(' ...

  6. ios 自定义delegate(一)

    在自定义协议的头文件 .h中 @protocol NSDelegate <NSObject>@optional  //可选 - (void)OnOption:(NSString *)pSt ...

  7. Oracle数据库日常SQL的使用

    DDL 语句(数据定义语言Create.Alter. Drop.Truncate) 1.建表:create table 表名(): 2.复制表结构及其数据:create table 新表名 as se ...

  8. phpstudy里升级mysql版本到5.7

    phpstudy里没有地方可以设置mysql数据库,很多人都疑惑在phpstudy里怎么升级mysql数据库版本,本文就教你如何在phpstudy中升级mysql的版本. PhpStudy集成环境中的 ...

  9. 5. 在Datadir目录外创建单独表空间

    5. 在Datadir目录外创建单独表空间 要在MySQL dadadir之外的位置创建单独表空间,请使用该子句: DATA DIRECTORY = '/path' 在目标目录中,MySQL会创建一个 ...

  10. DB2数据库在线备份还原

    DB2在线备份设置方法: 第一步:开启归档日志 db2 update db cfg for TEST_DB  using logretain on 第二步:重启数据库 第三步:进行一次离线备份 db2 ...