| ||||||||||
| 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 | |||||||||
我的更暴力,看看我的强连通分量+传递闭包#include<iostream>
#include<cstdio>
using namespace std;
int map[1002][1002],low[1002],dfn[1002],dfdeep,visit[1002];
int Z[1002],head,cur[1002];
int tree[1000][1000],belong[1002];
int n,m,T,num;
void init()
{
int i,j;
for(i=1;i<=n;i++)
{
visit[i]=dfn[i]=low[i]=cur[i]=belong[i]=0;
for(j=1;j<=n;j++)
map[i][j]=tree[i][j]=0;
}
num=0;
for(i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y]=1;
}
}
void dfs(int x)
{
int i;
head++;
Z[head]=x;
cur[x]=1;
visit[x]=1;
dfdeep++;
low[x]=dfn[x]=dfdeep;
for(i=1;i<=n;i++)
if(map[x][i])
if(!visit[i])
{
dfs(i);
if(low[i]<low[x])
low[x]=low[i];
}
else
if(cur[i])
if(dfn[i]<low[x])
low[x]=dfn[i];
if(low[x]==dfn[x])
{
num++;
while(1)
{
if(head<0)
break;
int v=Z[head];
head--;
belong[v]=num;
cur[v]=0;
if(v==x)
break;
}
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
int i,j;
for(i=1;i<=n;i++)
if(!dfn[i])
{
head=-1;
dfs(i);
if(head>=0)
{
num++;
while(1)
{
if(head<0)
break;
int v=Z[head];
head--;
belong[v]=num;
}
}
}
int length=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][j]&&belong[i]!=belong[j])
tree[belong[i]][belong[j]]=1;
int k;
for(k=1;k<=num;k++)
for(i=1;i<=num;i++)
if(tree[i][k])
for(j=1;j<=num;j++)
if(tree[k][j])
tree[i][j]=true;
int flag=1;
for(i=1;i<=num;i++)
for(j=1;j<=num;j++)
if(!tree[i][j]&&!tree[j][i]&&i!=j)
flag=0;
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator