呵呵,我直接拓扑排序,能拍出就YES,否则NO,A了。。。
1.这是直接用邻接矩阵存的。
#include<stdio.h>
#include<string.h>
int map[503][503],n,dg[503],ans[503];
int tpsort()
{
int i,k,d,f;
k=0;
while(k<n)
{
for(i=f=0;i<n;i++)
if(dg[i]==0) //每次把入度为0 的边加到ans内,并删除i到各点的边;
{
f=1;
dg[i]--;
ans[k++]=i;
for(d=0;d<n;d++)
if(map[i][d])
dg[d]--;
break;
}
if(!f)
return 0;
}
return 1;
}
int main ()
{
int m,i,x,y;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
memset(map,0,sizeof(map)); //map有边为1,无边为0;
memset(dg,0,sizeof(dg)); //初始化入度为0;
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
if(!map[x][y])//去重边?好吧,不加这就超时了。。。。。
{
map[x][y]=1; //加入边
dg[y]++; //入度加1;
}
}
if(tpsort()) //拓扑排序,结果在ans里;
puts("YES");
else
puts("NO");
}
return 0;
}
2.这是邻接表存的地图。
#include<stdio.h>
#include<string.h>
struct Node
{
int indg;
int n,next[102];
}map[102];
int tosort (int n)
{
int k,i,d,f;
k=0;
while(k<n)
{
f=0;
for(i=0;i<n;i++)
if(map[i].indg==0)
{
k++;
f=1;
map[i].indg--;
for(d=0;d<map[i].n;d++)
map[map[i].next[d]].indg--;
}
if(!f)
return 0;
}
return 1;
}
int main()
{
int n,m,i,x,y;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
memset(map,0,sizeof(map));
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
if(x!=y)
{
map[y].indg++;
map[x].next[map[x].n]=y;
map[x].n++;
}
}
if(tosort(n))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
看来邻接表好点。。。。(第一个是临界表的结果,第二个是邻接矩阵)