poj2762 Going from u to v or from v to u?

来源:互联网 发布:ubuntu查看64位 32位 编辑:程序博客网 时间:2024/06/06 07:36

题意:给出一个有向图,判断任意两个点是否“弱联通”,即对于任意两个点u,v,u能到v,或者v能到u。


分析:1.tarjan将原图缩点,形成一个有向无环图。

            2.dfs判断原图是否是一条链,即一个点不能同时指向两个点,否则这两个点无法符合条件。


技能:

if (!dfn[to]) //没有访问过{tarjan(to);low[u]=min(low[u],low[to]);}else if (instack[to]) low[u]=min(low[u],dfn[to]);//访问过了且还未属于一个联通块注意不要写错


代码:

#include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;#define rep(i,j,k) for (int i=j;i<=k;++i)#define dep(i,j,k) for (int i=j;i>=k;--i)#define N 6010#define cl(x) memset(x,0,sizeof(x))#define min(a,b) a>b? b:aint head[N],dfn[N],Stack[N],instack[N],low[N],belong[N],in[N],Head[N]; int T,n,m,id,Time,taj,top,now,Id;#define to e[i].v#define To E[i].vvector<int> bcc[N];struct node{int v,next;}e[N<<1],E[N<<1];int read(){int f=1,x=0;char ch=getchar();for (;ch>'9'||ch<'0';ch=getchar()) if (ch=='-') f=-1;for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*f;}void add(int u,int v) {e[id].v=v; e[id].next=head[u]; head[u]=id++;}void Add(int u,int v) {E[Id].v=v; E[Id].next=Head[u]; Head[u]=Id++;}int check(){queue<int>q;rep(i,1,taj) if (in[i]==0) q.push(i); if (q.size()>1) return 0;while (!q.empty()){int u=q.front(); q.pop();for (int i=Head[u];i;i=E[i].next){in[To]--;if (in[To]==0) q.push(To);}if (q.size()>1) return 0;}return 1;} void tarjan(int u){low[u]=dfn[u]=++Time;instack[u]=1; Stack[++top]=u;for (int i=head[u];i;i=e[i].next)if (!dfn[to]){tarjan(to);low[u]=min(low[u],low[to]);}else if (instack[to]) low[u]=min(low[u],dfn[to]);if (dfn[u]==low[u]){bcc[++taj].clear();do {now=Stack[top--];instack[now]=0;bcc[taj].push_back(now);belong[now]=taj;}while (u^now);}}int main(){T=read();for (;T--;){n=read(); m=read(); id=1; Id=1; cl(in); cl(Head);cl(head); cl(dfn); cl(low); cl(Stack); cl(instack); cl(belong); Time=taj=top=0; rep(i,1,m) {int u=read(),v=read(); add(u,v);}rep(i,1,n) if (!dfn[i]) tarjan(i);rep(u,1,n) for (int i=head[u];i;i=e[i].next)if (belong[u]^belong[to]) Add(belong[u],belong[to]),in[belong[to]]++;if (check()) printf("Yes"); else printf("No"); puts("");} return 0;}

阅读全文
0 0
原创粉丝点击