給定有向圖 n≤10 點 m 邊,判斷是否存在合法拓撲序列(即是否為 DAG)。多測試用例。
#include <stdio.h>
#include <string.h>
int n, m, map[20][20], in[20];
void topo() {
int i, j, k, flag;
for (i=1;i<=n;i++) {
flag=0;
for (j=1;j<=n;j++) if (in[j]==0) {
flag=1; in[j]=-1;
for (k=1;k<=n;k++) if (map[j][k]) in[k]--;
break;
}
if (!flag) break;
}
puts(flag?"YES":"NO");
}
int main() {
int u, v;
while (~scanf("%d%d",&n,&m)) {
memset(map,0,sizeof(map));
memset(in,0,sizeof(in));
while (m--) { scanf("%d%d",&u,&v); map[u][v]=1; in[v]++; }
topo();
}
return 0;
}
O(n^2),n≤10 極快。