首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

NOJ 1119 仙林鼎山游樂園:Floyd 判環

     編輯:關於C++

問題描述

給定有向圖 n≤50,判斷是否存在環。多測試用例。

Floyd 传遞閉包判環

用 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 是首選。掌握「傳遞閉包 + 互達判環」模板,秒殺同類問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved