uva10305 Ordering Tasks
题意 输入n,m 表示n个事件,和m个事件发生顺序,输入m行a b,表示a在b之前发生,最后输出事件发生顺序,任意一个即可
解法 简单的拓扑排序。水过
#include <stdio.h>
#include <string.h>
int map[105][105];
int du[105];
int n, m;
int i, j;
int a, b;
int vis[105];
int output[105];
int t;
int to()
{
int i, j;
for (i = 1; i <= n; i ++)
{
if (du[i] == 0 && vis[i] == 0)
{
output[t++] = i;
vis[i] = 1;
for (j = 1; j <= n; j ++)
{
if(map[i][j] == 1)
du[j] --;
}
}
}
return 0;
}
int main()
{
while(scanf("%d%d", &n, &m) !=EOF && (n || m))
{
t = 0;
memset(map, 0, sizeof(map));
memset(du, 0, sizeof(du));
memset(vis, 0, sizeof(vis));
memset(output, 0, sizeof(output));
for (i = 0; i < m; i ++)
{
scanf("%d%d", &a, &b);
if (map[a][b] == 0)
{
map[a][b] = 1;
du[b] ++;
}
}
while (t != n)
{
to();
}
for (i = 0; i < t - 1; i ++)
printf("%d ", output[i]);
printf("%d\n", output[t - 1]);
}
return 0;
}