給定有向圖 n≤50,判斷是否存在環。多測試用例。
用 reach[i][j] 表示是否存在路徑 i→j。Floyd 算法:reach[i][j] |= reach[i][k] & reach[k][j]。最後檢查是否存在 reach[i][j] && reach[j][i](即 i 和 j 互達),存在則有環。
bool reach[55][55];
int main() {
int T; scanf("%d",&T);
while (T--) {
int n,m; scanf("%d%d",&n,&m);
memset(reach,0,sizeof(reach));
while (m--) {
int u,v; scanf("%d%d",&u,&v);
reach[u][v]=true;
}
for (int k=0;k
n≤50,Floyd O(n^3)=125,000 極快。reach[i][j] 表示任意長度路徑存在性,非僅直接邊。i→j 且 j→i ⇒ 存在包含 i,j 的環。NOJ 1119 是有向圖判環的基礎題。Floyd 传遞閉包代碼最簡潔,無需 DFS 顏色標記、棧管理。對於 n≤50 的稠密圖,Floyd 是首選。掌握「傳遞閉包 + 互達判環」模板,秒殺同類問題。