pku 2762(强连通分量+缩点+DFS)

问给出的图中任意两点是否可以由u到v或者由v到u。

求一次强连通分量,然后将每个分量看成一个点,若分量中一个点连通另一个分量中的点则这两个分量联通,然后DFS计算传递闭包。

用cc数组记录每两个分量是否可达。

 

#include <stdio.h> #include <cstring> #include <stack> using namespace std; const int MAXN=1005; class node { public: int v; node *next; }; node edge[MAXN],Index[MAXN*10]; bool instack[MAXN]; int my_stack[MAXN*2],step; //step用来记录栈中元素个数 int DFN[MAXN],belong[MAXN],low[MAXN],pos,cnt,numv,visitNum,deep; //numv为点的个数,pos为索引表的下标,cnt为连通分量计数器,deep计算迭代深度,即表示每个分量所包含的点的个数 //DFN为时间戳,belong记录每个点属于哪个分量,in记录出度 bool cc[MAXN][MAXN]; void add_edge(int u,int v) //构造邻接表 { node* ptr=&Index[pos++]; ptr->v=v; ptr->next=edge[u].next; edge[u].next=ptr; } void tarjan(int x) { int tag; DFN[x]=++visitNum; low[x]=visitNum; instack[x]=true; my_stack[++step]=x; for(node *ptr=edge[x].next;ptr!=NULL;ptr=ptr->next) { tag=ptr->v; if(!DFN[tag]) { tarjan(tag); if(low[tag]<low[x]) low[x]=low[tag]; } else if(instack[tag] && DFN[tag] < low[x]) low[x]=DFN[tag]; } if(DFN[x]==low[x]) { cnt++; do { tag=my_stack[step--]; instack[tag]=false; belong[tag]=cnt; } while(tag!=x) ; } } //求传递闭包,若a->b,b->c.则a->c。 void DFS(int u,int v) { if(cc[u][v]) return; cc[u][v]=true; for(node *ptr=edge[v].next;ptr!=NULL;ptr=ptr->next) { if(belong[u]!=belong[ptr->v]) DFS(u,ptr->v); if(belong[v]!=belong[ptr->v]) DFS(v,ptr->v); } } void solve() { bool flag=true; cnt=0; visitNum=0; step=0; memset(DFN,0,sizeof(DFN)); memset(instack,false,sizeof(instack)); memset(low,0,sizeof(low)); memset(cc,false,sizeof(cc)); //init for(int i=1;i<=numv;++i) if(!DFN[i]) tarjan(i); for(int i=1;i<=numv;++i) { for(node *ptr=edge[i].next;ptr!=NULL;ptr=ptr->next) { if(belong[i]!=belong[ptr->v]) DFS(i,ptr->v); } } for(int i=1;i<=cnt;++i) for(int j=1;j<=cnt;++j) { if(i!=j && !cc[i][j] && !cc[j][i]) //若i不能联通j,j也不能联通i,则无解 { flag=false; break; } } if(flag) printf("Yes/n"); else printf("No/n"); } int main() { int n,u,v,cas; scanf("%d",&cas); while(cas--) { scanf("%d%d",&numv,&n); pos=0; for(int i=1;i<=numv;++i) edge[i].next=NULL; for(int i=0;i<n;++i) { scanf("%d%d",&u,&v); add_edge(u,v); } solve(); } return 0; }

你可能感兴趣的:(null,Class)