【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 ...
随机推荐
- synchronize早已经没那么笨重
我发现一些同学在网络上有看不少synchronize的文章,可能有些同学没深入了解,只看了部分内容,就急急忙忙认为不能使用它,很笨重,因为是采用操作系统同步互斥信号量来实现的.关于这类的对于synch ...
- 031_spark架构原理
spark核心组件 driver master worker executor task(只有task是线程) 核心组件的原理图解
- 如何处理Docker的错误消息request canceled:Docker代理问题
在本地安装Kubernetes时,遇到错误消息: request canceled while waiting for connection(Client.Timeout exceeded while ...
- Window.Event.KeyCode的含义
Window.Event.KeyCode=13的含义(转载) 2011-04-16 09:41:18| 分类: html | 标签:keycode event realkey var do ...
- 用python+pygame写贪吃蛇小游戏
因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...
- ElasticSearch的常用方法
关键词 cluster 集群 shards 索引分片 replicas 索引的副本 recovery 数据重新分布 gateway 索引的持久化方式 Transport 交互 ...
- react中的jsx详细理解
这是官网上的一个简单的例子 const name = 'Josh Perez'; const element = <h1>Hello, {name}</h1>; ReactDO ...
- No-5.远程管理常用命令
远程管理常用命令 目标 关机/重启 shutdown 查看或配置网卡信息 ifconfig ping 远程登录和复制文件 ssh scp 01. 关机/重启 序号 命令 对应英文 作用 01 shut ...
- onPullDownRefresh函数没有被正确执行
原因 问题原因很多,我遇到的这个问题的原因是: 页面有两个同名的onPullDownRefresh函数,导致只执行最后的一个. 解决 只留一个onPullDownRefresh函数
- nginx发布web网站
修改/conf/nginx.conf配置文件 server { listen *:; # Listen server_name ""; # Don't worry if " ...