Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re: 贴在这里, 谁看看吧, 非常非常感谢In Reply To: 贴在这里, 谁看看吧, 非常非常感谢 Posted by:twf at 2008-04-30 18:05:30 > #define MAXV 1001 > #define MAXM 6000 > #include<cstdlib> > #include<cstdio> > struct Node > { > int no; > Node* next; > }; > > int nodesize; > Node buffer[MAXM*2]; > int bufPos; > > Node*Adj[MAXV][2]; > > int id[MAXV], postR[MAXV], postI[MAXV]; > int cnt, scnt; > > bool ker[MAXV][MAXV]; > /** > * Insert a edge into the graph, and it's reverse respertively. > **/ > int insert(int i, int j) > { > Node*t=buffer+nodesize*bufPos++; > (*t).no=j; > (*t).next=Adj[i][0]; > Adj[i][0]=t; > > t=buffer+nodesize*bufPos++; > (*t).no=i; > (*t).next=Adj[j][1]; > Adj[j][1]=t; > } > > void dfsR(Node* r, int w, int n) > { > id[w]=scnt; > for (Node* t=r; t!=NULL; t=(*t).next) > { > int v=(*t).no; > if (id[v]==-1) > dfsR(Adj[v][n], v, n); > } > postI[cnt++]=w; > } > > /*** > **Find the strong connected components of the graph > ***/ > void sc(int n) > { > int v; > cnt=1; scnt=1; > for (v=1; v<=n; v++) id[v]=-1; > > for (v=1; v<=n; v++) > { > if (id[v]==-1) > { > dfsR(Adj[v][1], v, 1); > } > } > for (v=1; v<=n; v++) > { > postR[v]=postI[v]; > } > > cnt=1; scnt=1; > for (v=1; v<=n; v++) id[v]=-1; > for (v=n; v>0; v--) > { > if (id[postR[v]]==-1) > { > dfsR(Adj[postR[v]][0], postR[v], 0); > } > scnt++; > } > > } > > bool runRch() > { > int n, m; > int i, j, k; > int a, b; > scanf("%d%d", &n, &m); > for (i=1; i<=n; i++) > Adj[i][0]=Adj[i][1]=NULL; > for (i=0; i<m; i++) > { > scanf("%d%d", &a, &b); > insert(a, b); > } > sc(n); > for (i=1; i<=n; i++) > for (j=1; j<=n; j++) > ker[i][j]=false; > > for (i=1; i<=n; i++) > for (Node*p=Adj[i][0]; p!=NULL; p=(*p).next) > { > int w=(*p).no; > ker[id[i]][id[w]]=true; > } > > for (k=1; k<scnt; k++) > for (i=1; i<scnt; i++) > if (ker[i][k]) > for (j=1; j<scnt; j++) > if (ker[k][j]) > ker[i][j]=true; > /**for (i=1; i<=n; i++) > { > printf("%d", id[i]); > } > printf("\n");**/ > int ii, ij; > for (i=1; i<=n; i++) > for (j=1; j<=n; j++) > { ii=id[i]; ij=id[j]; > if (ii!=ij) > if (!ker[ii][ij]&&!ker[ij][ii]) > return false; > } > > return true; > } > > > int main() > { > int t; > nodesize=sizeof(Node); > scanf("%d", &t); > for (; t>0; t--) > { > bufPos=0; > if (runRch()) > { > printf("Yes\n"); > } > else > { > printf("No\n"); > } > } > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator