Description

有n个城镇被分成了k个郡,有m条连接城镇的无向边。要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都。

Input

第一行有三个整数,城镇数n(1<=n<=10^6),边数m(0<=m<=10^6),郡数k(1<=k<=n)。

接下来m行,每行有两个整数ai和bi(ai≠bi),表示有一条无向边连接城镇ai和bi。

接下来k行,第j行以一个整数wj开头,后面是wj个整数,表示第j个郡包含的城镇。

Output

若有解输出TAK,否则输出NIE。

每个点 $x$ 拆成两对点,$x$ 代表选择 $x$ 为首都,$x+n$ 表示不选择 $x$ 为首都,$x+2n$ 表示 $x$ 的前缀已包含首都,$x+3n$表示 $x$ 的前缀不包含首都。

对于每一条原图中无向边 $(x,y)$ ,因为至少有一个端点为首都,连边 $(x+n,y)$ ,$(y+n,x)$。

对于每一个点 $x$ ,连边 $(x,x+2n)$ ,$(x+3n,x+n)$。

对于每一个点 $x$ 与它的上一个点 $last$ ,连边方式如下:$(last+2n,x+2n)$,$(x+3n,last+3n)$,$(last+2n,x+n)$,$(x,last+3n)$。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int N=4e6+;
int n,m,k,cnt,x,y,last,tim,top,color;
int first[N],dfn[N],low[N],sta[N],c[N];
bool vis[N];
struct edge{int to,next;}e[N*];
void ins(int u,int v){e[++cnt]=(edge){v,first[u]};first[u]=cnt;}
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
void tarjan(int x)
{
low[x]=dfn[x]=++tim;
sta[++top]=x;vis[x]=true;
for(int i=first[x];i;i=e[i].next)
{
int to=e[i].to;
if(!dfn[to])tarjan(to),low[x]=min(low[x],low[to]=min(low[x],low[to]));
else if(vis[to])low[x]=min(low[x],dfn[to]);
}
if(low[x]==dfn[x])
{
color++;
while(sta[top]!=x)vis[sta[top]]=false,c[sta[top--]]=color;
vis[x]=false;c[x]=color;top--;
}
}
bool check()
{
for(int i=;i<=n;i++)
if(c[i]==c[i+n]||c[i+*n]==c[i+*n])return false;
return true;
}
int main()
{
n=read();m=read();k=read();
for(int i=;i<=m;i++)
{
x=read();y=read();
ins(x+n,y);ins(y+n,x);
}
for(int i=;i<=k;i++)
{
x=read();last=;
for(int j=;j<=x;j++)
{
y=read();
ins(y,y+*n);ins(y+*n,y+n);
if(last)
{
ins(last+*n,y+*n);
ins(y+*n,last+*n);
ins(last+*n,y+n);
ins(y,last+*n);
}
last=y;
}
}
for(int i=;i<=*n;i++)if(!dfn[i])tarjan(i);
if(check())printf("TAK");
else printf("NIE");
return ;
}

【bzoj 3495】PA2010 Riddle的更多相关文章

  1. 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)

    1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...

  2. Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路

    首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...

  3. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  4. LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego

    [bzoj 4281] [ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点. ...

  5. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  6. 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3940  Solved: 1736 Description ...

  7. 【BZOJ 2132】圈地计划 && 【7.22Test】计划

    两种版本的题面 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土 ...

  8. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  9. 【BZOJ 1032】 [JSOI2007]祖码Zuma

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1032 [题意] [题解] /* 设f[i][j]表示从第i个珠子开始的j个珠子被消除; ...

随机推荐

  1. SQL实验一

    一.实验目的: 了解数据库的结构特点.领会数据库中三种类型的文件特点 学会创建和管理数据库的方法 了解SQL SERVER的基本数据类型 了解表结构的特点,学会创建和管理表的方法 学会使用T-SQL语 ...

  2. CG-CTF simple-machine

    运行一下,输入flag: 用ida打开: input_length和input_byte_804B0C0为重命名的变量:现在一个个看调用的函数. sub_8048526(): 这个函数使用了mmap分 ...

  3. JSP中常用的的EL表达式的汇总

    Jsp基础知识 jsp的组成 html静态页面(css.javascript) java代码 <% %> (_jspService方法中) 内置对象 out request 表达式 < ...

  4. webpack code splitting

    一.代码分割优化 const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin' ...

  5. CMDB(Configuration Management Database)资产管理系统和 运维自动化

    一.传统运维方式和自动化运维的区别 二.CMDB的介绍 三.CMDB的四种方式 四.项目的目录架构介绍以及配置文件的升级编写 五.比较low的项目架构书写 六.可插拔式收集资产 七.对收集的服务器信息 ...

  6. fuser:command not found

    yum 安装fuser命令 yum install -y psmisc

  7. Fetch API & Async Await

    Fetch API & Async Await const fetchJSON = (url = ``) => { return fetch(url, { method: "G ...

  8. 修改注册表信息来兼容当前WebBrower程序

    public class WebBrower { /// <summary> /// 修改注册表信息来兼容当前程序 /// /// </summary> public stat ...

  9. python一(字符串,字典)

    list操作 name = ['小王','小米','小张','王强','张三','李四'] name.append('黄霑')#添加元素在最后一个 name.insert(,'王五')#指定下标插入元 ...

  10. Ubuntu 16.04 RabbitMq 安装与运行(安装篇)

    Ubuntu 16.04 RabbitMq 安装与运行(安装篇) 2018年08月15日 15:05:24 我跟吴彦祖四六开 阅读数:1966   前言 目前公司用阿里云 + redis 的方式实现的 ...