【ZJOI2017 Round1练习】D2T1 river(二分图)
题意:
思路:这道题并没有官方题解
没有羊驼在所有三元组中出现就是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(二分图)的更多相关文章
- BZOJ1143 [CTSC2008]祭祀river 二分图匹配 最小链覆盖
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1143 题意概括 给出一个有向图.求最小链覆盖. 题解 首先说两个概念: 链:一条链是一些点的集合, ...
- 【ZJOI2017 Round1后记】
2017.4.1: NOIP+Round1综合成绩出来,标准分离续命线差了80分,果然还是联赛坑挖太大了…… 不管怎么说能续命的话还是要试一下的…… 发毒誓:Round2前不打手游,不看NGA,不看星 ...
- [图论训练]1143: [CTSC2008]祭祀river 二分图匹配
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在 水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...
- 【ZJOI2017 Round1练习&BZOJ4765】D1T3 普通计算姬(主席树,分块)
题意: 思路:分块 使用树状数组维护sum[i]的前缀和 使用主席树维护root到u的路径上点的编号出现的个数 每次操作如果是修改就加入队列 如果是询问,考虑块内操作对询问的影响,每次在x点加上y会使 ...
- 【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 ...
- 【ZJOI2017 Round1练习】D2T3 counter(线段树)
题意: 思路: 预处理出b[i]代表i位置之前比a[i]小的数的个数 以每个数为结尾的组数是线段树中(1,a[i]-1) 对于a[i]换到最后,相当于线段树中(a[i]+1,n)-- 交换后b[i]又 ...
- 【ZJOI2017 Round1练习&BZOJ4767】D1T3 两双手(排列组合,DP)
题意: 100%的数据:|Ax|,|Ay|,|Bx|,|By| <= 500, 0 <= n,Ex,Ey <= 500 思路:听说这是一道原题 只能往右或者下走一步且有禁止点的简化版 ...
- 【ZJOI2017 Round1练习&BZOJ4766】D1T2 文艺计算姬(Prufer编码)
题意:给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图K_{n,m},求其生成树个数 mod p. 100%的数据:1 <= n,m,p <= 10^18 思路:这是 ...
- 【ZJOI2017 Round1练习】
喜闻乐见(爆蛋滚粗)的ZJOI模拟赛终于开始了 可以又一次感受被屠的快感 DAY1: T1:线段树打错-70 正解分块听卡常还要调块的大小 T2:数学弱爆 是道结论题 T3:暴力分滚粗 DAY2: T ...
随机推荐
- String的用法——构造方法
package cn.itcast_01; /* 字符串:就是多个字符组成的一串数据,也可以看成一个字符数组 *通过API,我们得知: A: 字符串字面值,如abc,也可以看做一个对象 B:字符串是常 ...
- html5表单新增的元素与属性
1.表单内元素的form属性 在html4中,表单内的从属元素必须书写在表单内部, 而在html5中,可以把他们书写在页面上任何地方, 然后为该元素指定一个form属性,属性值为该表单的id,这样就可 ...
- enum,sizeof,typedef
枚举类型的使用方法 enum是C语言中的一种自定义类型 enum值可以根据需要自定义整形值 第一个定义的enum值默认为0 默认情况下的enum值是在前一个定义值得基础上加1 enum类型的变量只能去 ...
- LC.exe 已退出,代码为-1 问题解决
最近一个c#工程,之前编译正常.后重装系统,安装DevExpress后,编译一直失败,并提示"4>C:\Windows\Microsoft.NET\Framework\v4.0.303 ...
- qs库 是将url参数和json互转 | query strings 缩写 | import qs from 'qs'
import qs from 'qs' 1.npm地址 https://www.npmjs.com/package/qs 2.概述 将url中的参数转为对象: 将对象转为url参数形式 3.示例 ...
- Python基础3 函数 变量 递归 -DAY3
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- js 根据指定个数切割数组
Part.1 问题 写项目时,遇到需要前端做 假分页 的问题:后端会将数据全部返回,前端自己做分页 Part.2 思路 拿到后端全部返回的数据后,按照 产品需求 进行分页,如每页显示 10 条数据为 ...
- ES6 第三章 变量的解构赋值 具体参照http://es6.ruanyifeng.com
1.基本用法 let [a, b, c] = [1, 2, 3];左右两边解构格式要保持一致. 2.默认值 let [x, y = 'b'] = ['a']; // x='a', y='b' let ...
- Report Builder 打开报错
提示:REP-0756:警告:找不到PL/SQL程序库’inv.pll’. 解决办法 处理:1.运行 ---输入REgedit ,在注册表内,查找注册表项Reports_path. 2.将下载的.pl ...
- IIS实现HTTPS的主机名绑定
默认情况下,IIS中HTTPS 绑定是无法指定主机名的解决办法:通过手工修改 IIS 配置来实现主机头绑定.打开如下位置的文件. C:\Windows\system32\inetsrv\config\ ...