【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 ...
随机推荐
- canvas基础绘制-绚丽时钟
效果图: 与canvas基础绘制-绚丽倒计时的代码差异: // var endTime = new Date();//const声明变量,不可修改,必须声明时赋值: // endTime.setTim ...
- 【经验总结】关于使用某些第三方插件库元素设置display:none后重新show不显示的问题;(display、opacity、宽高0的使用场景)
display:none 直接取消元素所占用的位置(但是元素还是存在的),后面元素看他就相当于不存在了: opacity:0 隐藏,但是其依旧占用位置: height.width:0 和displa ...
- sql server 全部错误号详释
0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效. 7 存储控制块被损坏. 8 存储空间不足,无法处理此 ...
- LibreOJ #119. 最短路 (堆优化dijkstra)
题目描述 给一个 n(1≤2500≤n) n(1 \leq 2500 \leq n)n(1≤2500≤n) 个点 m(1≤6200≤m) m(1 \leq 6200 \leq m)m(1≤6200≤m ...
- EXCEL Skills Commonly Used
1. 判断某一列中的数据是否在另一列中 http://jingyan.baidu.com/article/358570f67fd4b0ce4724fc29.html 2. 快速删除excel中的空格( ...
- 聊天室(C++客户端+Pyhton服务器)2.基本功能添加
根据之前的框架添加新的功能 登录 点击相关按钮 // 登录按钮的响应void CMainDialog::OnBnClickedLogin(){ // 1. 获取用户输入的数据 UpdateData(T ...
- C++之类成员的访问权限详解(一)
概念解析 众所周知,面向对象编程语言的特征之一就是封装,不同编程语言对于封装提供的实现有所不同,但原理大体上是相同的.C++提供了三种不同程度的访问权限来实现,主要是通过public.private. ...
- POJ-3190-分配畜栏
这个题首先,我们需要注意的是它的时间是一秒,其中还包括了你读入数据的时间,因为cin我写的时候没有解除绑定,所以直接超时,我们直接用scanf函数读入50000组数据好了. 然后就是poj交的时候,如 ...
- ssh服务介绍
基本介绍 ssh:安全的远程登陆 要有客户端与服务器端,客户端主动链接服务端,那么服务端地址是不能变的. socket:套接字 标识应用唯一的地址 tcp/udp port端口号 cat /etc/s ...
- phpstorm使用Database关联数据库
1.如图选择mysql 配置数据库连接及shh 点击Test Connection,如果成功,即可点击ok连接mysql数据库 2.如图选择所有的表 3.更新数据