拓扑排序是用于图的算法的一种。
适用于对于一些有偏序关系的图。比如说比赛排名,大学课堂选修之类的。
要求昨完某件事情才能做另一件事情,输出做事情的次序。
在一个图中。确定好次序关系后。入度为0的那个点必代表着最先需要做的事情。
然后输出这个点。再把这个点出度指向的地方全部入度减一。就这样一直下去,知道全部输出结束。
hdu 1285
#include<stdio.h>
#include<string.h>
int map[600][600];
int in[600];
int visit[600];
int main()
{
int n,m,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j,leap;
memset(map,0,sizeof(map));
memset(in,0,sizeof(in));
memset(visit,0,sizeof(visit));
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
if(map[a][b]==0)
in[b]++;
map[a][b]=1;
}
leap=n;
while(leap)
{
for(i=1;i<=n;i++)
{
if(in[i]==0&&visit[i]==0)
{
visit[i]=1;
printf("%d",i);
leap--;
if(leap!=0)
printf(" ");
else
printf("\n");
break;
}
}
for(j=1;j<=n;j++)
{
if(map[i][j]==1)
in[j]--;
}
}
}
return 0;
}
hdu 2094
#include<stdio.h>
#include<string.h>
struct list
{
char str[1000];
}s[1000];
int num;
int shu(char *str)
{
int i;
for(i=0;i<num;i++)
{
if(strcmp(s[i].str,str)==0)
{
return i;
}
}
return -1;
}
int main()
{
int in[1000],n;
while(scanf("%d%*c",&n)&&n)
{
int i,a,b,leap;
num=0;
char str1[1000],str2[1000];
memset(in,0,sizeof(in));
for(i=0;i<n;i++)
{
scanf("%s %s",str1,str2);
a=shu(str1);
b=shu(str2);
if(a==-1)
{
strcpy(s[num].str,str1);
a=num;num++;
}
if(b==-1)
{
strcpy(s[num].str,str2);
b=num;num++;
}
in[b]++;
}
leap=0;
for(i=0;i<num;i++)
{
if(in[i]==0)
leap++;
}
if(leap!=1)
{
printf("No\n");
}
else
printf("Yes\n");
}
return 0;
}