codeforces555E
Case of Computer Network
Andrewid the Android is a galaxy-known detective. Now he is preparing a defense against a possible attack by hackers on a major computer network.
In this network are n vertices, some pairs of vertices are connected by m undirected channels. It is planned to transfer q important messages via this network, the i-th of which must be sent from vertex si to vertex di via one or more channels, perhaps through some intermediate vertices.
To protect against attacks a special algorithm was developed. Unfortunately it can be applied only to the network containing directed channels. Therefore, as new channels can't be created, it was decided for each of the existing undirected channels to enable them to transmit data only in one of the two directions.
Your task is to determine whether it is possible so to choose the direction for each channel so that each of the q messages could be successfully transmitted.
Input
The first line contains three integers n, m and q (1 ≤ n, m, q ≤ 2·105) — the number of nodes, channels and important messages.
Next m lines contain two integers each, vi and ui (1 ≤ vi, ui ≤ n, vi ≠ ui), that means that between nodes vi and ui is a channel. Between a pair of nodes can exist more than one channel.
Next q lines contain two integers si and di (1 ≤ si, di ≤ n, si ≠ di) — the numbers of the nodes of the source and destination of the corresponding message.
It is not guaranteed that in it initially possible to transmit all the messages.
Output
If a solution exists, print on a single line "Yes" (without the quotes). Otherwise, print "No" (without the quotes).
Examples
4 4 2
1 2
1 3
2 3
3 4
1 3
4 2
Yes
3 2 2
1 2
3 2
1 3
2 1
No
3 3 2
1 2
1 2
3 2
1 3
2 1
Yes
Note
In the first sample test you can assign directions, for example, as follows: 1 → 2, 1 → 3, 3 → 2, 4 → 3. Then the path for for the first message will be 1 → 3, and for the second one — 4 → 3 → 2.
In the third sample test you can assign directions, for example, as follows: 1 → 2, 2 → 1, 2 → 3. Then the path for the first message will be 1 → 2 → 3, and for the second one — 2 → 1.
简要题意:给出一个无向图,给出q个询问S,T表示从S走到T。
问能否给这张图的边定向,使得满足q个询问
sol:因为是无向图,所以在同一个强联通分量中是两两可以随意到达,然后可以搞成一棵树,树上可以差分一下,两个数组p0,p1,S位置p0++,T位置p1++,Lca处p0--,p1--,看看是否有一个点既有p0又有p1就No了
/*
¼òÒªÌâÒ⣺¸ø³öÒ»¸öÎÞÏòͼ£¬¸ø³öq¸öѯÎÊS£¬T±íʾ´ÓS×ßµ½T¡£
ÎÊÄÜ·ñ¸øÕâÕÅͼµÄ±ß¶¨Ïò£¬Ê¹µÃÂú×ãq¸öѯÎÊ
*/
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,M=;
int n,m,Q;
int tot=,Next[M],to[M],head[N];
struct Ques{int S,T;}qq[N];
inline void Link(int x,int y)
{
Next[++tot]=head[x]; to[tot]=y; head[x]=tot;
}
int cnt=,dfn[N],low[N],top=,Sta[N],now=,Bel[N];
bool ins[N];
inline void tarjan(int x,int fat)
{
int i;
bool bo=;
dfn[x]=low[x]=++cnt; Sta[++top]=x; ins[x]=;
for(i=head[x];i;i=Next[i])
{
if(to[i]==fat&&bo) {bo=; continue;}
if(!dfn[to[i]])
{
tarjan(to[i],x); low[x]=min(low[x],low[to[i]]);
}
else if(ins[to[i]]) low[x]=min(low[x],dfn[to[i]]);
}
if(dfn[x]==low[x])
{
int oo=; now++;
while(oo!=x)
{
oo=Sta[top--]; Bel[oo]=now; ins[oo]=;
}
}
}
vector<int>E[N];
#define PB push_back
int fa[N];
inline int gf(int x)
{
return (fa[x]==x)?(x):(fa[x]=gf(fa[x]));
}
int Dep[N],ff[N][];
inline void dfs(int x,int fat)
{
int i;
for(i=;i<E[x].size();i++) if(E[x][i]!=fat)
{
Dep[E[x][i]]=Dep[x]+; ff[E[x][i]][]=x; dfs(E[x][i],x);
}
}
inline int ask_lca(int x,int y)
{
int i;
if(Dep[x]<Dep[y]) swap(x,y);
for(i=;~i;i--) if(Dep[ff[x][i]]>=Dep[y]) x=ff[x][i];
if(x==y) return x;
for(i=;~i;i--) if(ff[x][i]!=ff[y][i]) x=ff[x][i],y=ff[y][i];
return ff[x][];
}
int path[N][];
bool Vis[N];
inline void dfss(int x,int fat)
{
int i;
Vis[x]=;
for(i=;i<E[x].size();i++)
{
int V=E[x][i]; if(V==fat) continue;
dfss(V,x);
path[x][]+=path[V][]; path[x][]+=path[V][];
}
}
int main()
{
// freopen("codeforces555E.in","r",stdin);
int i,j,x,y;
R(n); R(m); R(Q);
for(i=;i<=m;i++)
{
R(x); R(y); Link(x,y); Link(y,x);
}
for(i=;i<=Q;i++) {R(qq[i].S); R(qq[i].T);}
for(i=;i<=n;i++) if(!dfn[i]) tarjan(i,);
// cout<<"now="<<now<<endl;
// for(i=1;i<=n;i++) cout<<i<<' '<<Bel[i]<<endl;
// puts("");
for(i=;i<=now;i++) fa[i]=i;
for(i=;i<=n;i++)
{
for(j=head[i];j;j=Next[j])
{
int o1=gf(Bel[i]),o2=gf(Bel[to[j]]);
if(o1==o2) continue;
E[Bel[i]].PB(Bel[to[j]]); E[Bel[to[j]]].PB(Bel[i]); fa[o1]=o2;
}
}
for(i=;i<=now;i++) if(!Dep[i]) {Dep[i]=; dfs(i,);}
// for(i=1;i<=now;i++) cout<<i<<' '<<Dep[i]<<endl;
// puts("");
for(i=;i<=;i++) for(j=;j<=now;j++) ff[j][i]=ff[ff[j][i-]][i-];
// for(i=1;i<=now;i++) cout<<i<<' '<<ff[i][0]<<endl;
// puts("");
for(i=;i<=Q;i++)
{
int S=Bel[qq[i].S],T=Bel[qq[i].T];
// cout<<S<<' '<<gf(S)<<' '<<T<<' '<<gf(T)<<endl;
if(gf(S)!=gf(T)) return puts("No"),;
int lca=ask_lca(S,T);
// cout<<S<<' '<<T<<' '<<"lca="<<lca<<endl;
path[S][]++; path[lca][]--; path[T][]++; path[lca][]--;
}
// puts("");
// for(i=1;i<=now;i++) cout<<i<<' '<<path[i][0]<<' '<<path[i][1]<<endl;
for(i=;i<=now;i++) if(!Vis[i]) dfss(i,);
for(i=;i<=Q;i++)
{
int S=Bel[qq[i].S],T=Bel[qq[i].T]; if(S==T) continue;
if((path[S][]&&path[S][])||(path[T][]&&path[T][])) return puts("No"),;
}
puts("Yes");
return ;
}
/*
Input
4 4 2
1 2
1 3
2 3
3 4
1 3
4 2
Output
Yes Input
3 2 2
1 2
3 2
1 3
2 1
Output
No Input
3 3 2
1 2
1 2
3 2
1 3
2 1
Output
Yes
*/
codeforces555E的更多相关文章
随机推荐
- Python学习2——使用字符串(完整版)
""" 在C语言入门的时候字符串没有好好学习,导致后期语言根本没有入门, 更导致之后大量的codeing时间浪费,效率低下. 因此,借助这次Python入门,好好地将字符 ...
- mysql 登录修改密码与数据库备份
1.mysql首次登录修改密码 mysql -uroot -p(首次登录无密码,按回车即可:如果无法登陆,修改mysql配置文件,在[mysqld]最后一行加skip-grant-tables即可登录 ...
- 【KMP】Radio Transmission
问题 L: [KMP]Radio Transmission 题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入 第一行给出字 ...
- Servlet获取JSP中的汉字乱码问题解决方案
1.String customerName=request.getParameter("customer_name");这样会出现乱码 解决方案很简单: String custom ...
- 我是如何将一个加载90s的接口优化到不足2s的
一.提出问题 由于公司是做医疗级智能可穿戴设备的,所以数据(二进制数据)的存储方面有点特殊,数据没有存储于数据库里面,而是存储于磁盘上.可能有同学质疑,mysql的Blob类型也可以存储二进制数据啊, ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了
.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...
- EF的导航属性
在EF中,外键被称为导航属性. 在EF core中,查询的时候默认是只查自身而不会去查询外键表的.如果想要让查询结果包含外键实体,则需要使用include方法来让查询结果包含外键实体.如 db.Stu ...
- Python-memcached的使用用法
Memcached API set(key,val,time=0,min_compress_len=0) 无条件键值对的设置,其中的time用于设置超时,单位是秒,而min_compress_len则 ...
- Flutter 37: 图解 Flutter 基本动画 (一)
小菜一直对动画不太熟悉,最近学习了一些关于动画的皮毛知识,网上资料很多,小菜按自己的理解整理一下. Animation Animation 可以生成动画过程中的值,生成的值并非单一的 double 也 ...
- 少勇 #import和@class的区别
#import与@class的区别1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告 ...