传递闭包水体,这都错3次,BS一下自己。
#include <stdio.h>
#include <string.h>
#define N 105
struct Matrix
{
int mat[N][N];
};
void print(Matrix g, int n)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
printf("%3d", g.mat[i][j]);
}
printf("\n");
}
printf("\n");
}
void Flyod_Warshall(Matrix &g, int n)
{
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
g.mat[i][j] |= g.mat[i][k] & g.mat[k][j];
}
}
}
}
int main()
{
freopen("in", "r", stdin);
int n, m, st, ed, ans[N], top;
Matrix g;
while(scanf("%d", &n), n)
{
memset(g.mat, 0, sizeof(g.mat));
while(scanf("%d", &st), st)
{
while(scanf("%d", &ed), ed)
g.mat[st][ed] = 1;
}
Flyod_Warshall(g, n);
scanf("%d", &m);
for(int i = 0; i < m; i++)
{
scanf("%d", &st);
top = 0;
for(int j = 1; j <= n; j++)
{
if(!g.mat[st][j])
{
ans[top++] = j;
}
}
printf("%d", top);
for(int j = 0; j < top; j++)
printf(" %d", ans[j]);
printf("\n");
}
}
return 0;
}