您的位置:首页 > 编程语言 > Go语言

POJ 2762 Going from u to v or from v to u?

2009-04-26 19:03 330 查看
#include<iostream>
using namespace std;
#define MAX 6010
typedef struct arc
{
int adj;
int next;
}arc;
struct EDGE
{
int u,v;
}edge[MAX];
arc map[MAX];
arc rmap[MAX];
int p[MAX];
int rp[MAX];
int ts[MAX];
int sc[MAX];
int in[1100];
bool visit[1100];
bool graph[1100][1100];
int cnt,top;

void dfs1(int t)
{
int k,q;
visit[t]=true;
q=p[t];
while(q!=-1)
{
k=map[q].adj;
if(!visit[k])
dfs1(k);
q=map[q].next;
}
ts[top++]=t;
}

void dfs2(int t)
{
int q,k;
visit[t]=true;
sc[t]=cnt;
q=rp[t];
while(q!=-1)
{
k=rmap[q].adj;
if(!visit[k])
dfs2(k);
q=rmap[q].next;
}
}
bool Topusort(int n)
{
int t=0,i,j,count=0;
int degree[1100],stack[MAX];
int sum=0;
for(i=1;i<n;i++)
degree[i]=0;
for(i=1;i<n;i++)
{
for(j=1;j<n;j++)
if(graph[i][j])
degree[j]++;
}
for(i=1;i<n;i++)
{
if(!degree[i])
{
stack[t++]=i;
count++;
}
}
if(count>1)
return false;
while(t)
{
sum=0;
count++;
i=stack[--t];
for(j=1;j<n;j++)
{
if(graph[i][j])
if(!(--degree[j]))
{
stack[t++]=j;
sum++;
if(sum>1)
return false;
}
}
}
if(count<n)
return false;
else
return true;
}
int main()
{
int i,j=0,T;
int n,m,u,v;
scanf("%d",&T);
while(T>0)
{
scanf("%d%d",&n,&m);
memset(p,-1,sizeof(p));
memset(rp,-1,sizeof(rp));
memset(graph,false,sizeof(graph));
memset(in,0,sizeof(in));
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
map[i].next=p[u];
map[i].adj=v;
p[u]=i;
edge[i].u=u;
edge[i].v=v;

rmap[i].next=rp[v];
rmap[i].adj=u;
rp[v]=i;
}
top=1;
memset(visit,false,sizeof(visit));
for(i=1;i<=n;i++)
{
if(!visit[i])
dfs1(i);
}
cnt=1;
memset(visit,false,sizeof(visit));
for(i=n;i>=1;i--)
{
if(!visit[ts[i]])
{
dfs2(ts[i]);
cnt++;
}
}
// cout<<cnt<<endl;
int k=cnt;
for(i=1;i<=m;i++)
{
u=edge[i].u;
v=edge[i].v;
if(sc[u]!=sc[v])
{
graph[sc[u]][sc[v]]=true;
in[sc[u]]++;
}
}
cnt=0;
for(i=1;i<k;i++)
{
if(!in[i])
cnt++;
}
if(cnt>1)
printf("No/n");
else
{
if(Topusort(k))
printf("Yes/n");
else
printf("No/n");
}

//system("pause");
T--;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: