| ||||||||||
| 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 | |||||||||
贴在这里, 谁看看吧, 非常非常感谢In Reply To:请c++牛人帮忙查一个Runtime Error 的问题, 谢谢, 代码我发给你 Posted by:twf at 2008-04-30 16:16:13 #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