题意:

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

没有羊驼在所有三元组中出现就是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. dubbo系列--重要概念介绍

    dubbo架构图 节点角色说明 整体设计 proxyFactory:就是为了获取一个接口的代理类,例如获取一个远程接口的代理.它有2个方法,代表2个作用 getInvoker:针对server端,将服 ...

  2. IOS访问webserver接口

    接口调用参数只能是字符串格式,返回格式支持3种(字符串,数组,DataSet) 需要引用第三方库,包含(DataSet,PlatServinceDataParser,WebserviceCommon, ...

  3. laravel如何查找门脸及注入类方法

    门脸模式 通过 config/app.php 查看别名对应类名 Illuminate\Support\Facades\Log ,查看 LoggerInterface 类文件,得:命名空间+接口名 Ps ...

  4. IOStableviewsectionSet

    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {     if (t ...

  5. BST AVL RBT B- B+ 的一些理解

    BST(二叉查找树,排序二叉树),如果数据有序的话,组成的二叉树会形成单列的形式,导致查询效率低AVL(平衡二叉树) 使树的左右高度差的绝对值不超过2,保证了查询效率.但是插入和删除会带来多次旋转,导 ...

  6. 洛谷 P1955 程序自动分析

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...

  7. faster rcnn训练过程讲解

    http://blog.csdn.net/u014696921/article/details/60321425

  8. npm的替代品

    npm安装依赖包太慢,cnpm也快不到哪里去,偶然发现了yarn,特快特好用! 安装yarn:npm install -g yarn 查看版本号:yarn -v 安装依赖项:yarn install

  9. Educational Codeforces Round 59 (Rated for Div. 2) (前四题)

    A. Digits Sequence Dividing(英文速读) 练习英语速读的题,我还上来昏迷一次....只要长度大于2那么一定可以等于2那么前面大于后面就行其他no 大于2的时候分成前面1个剩下 ...

  10. KVM中的网络简介(qemu-kvm)

    emu-kvm主要向客户机提供了如下4种不同模式的网络: 1)基于网桥(bridge)的虚拟网卡 2)基于NAT(Network Addresss Translation)的虚拟网络 3)QEMU内置 ...