HDU 5438 Ponds 拓撲找環 dfs

2021-08-24 20:18:36 字數 740 閱讀 4461

題意:

略思路:

用拓撲找環的方法,o(n) 把度數為1(跟其相連的點小於2)的點去掉,並標記,那樣剩下一些環,然後dfs找每個環的權值和 和 環中結點的個數;將點個數為偶數的環去掉

其實這樣做的話可以直接計算 有奇數個點的環的權值;

#include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn = 1e4 + 7;

int n, m;

ll v[maxn];

vectorvec[maxn];

ll sum = 0;

int d[maxn];

bool vis[maxn];

void init()

for(int i = 0; i < m; ++i)

}ll dfs1(int id)

} return res;

}ll tmp, cnt;

void dfs2(int id)

}}void solve()

} for(int i = 1; i <= n; ++i)

printf("%lld\n", sum);

}int main()

return 0;

}

hdu 5438 Ponds(拓撲應用 DFS)

題目大意 p個池塘 m個連同渠 p個池塘的價值 m個連通渠的u與v 小於兩個連同渠的池塘去掉。找到剩餘的連通的池塘,並且只加連通的池塘的總個數為奇數個的連通塊的價值。詳見 寫的很繁瑣很差勁,哎,但還是分享下吧。include include include include includeusing ...

hdu5438(拓撲排序 dfs)

題意 p個頂點m條邊的無向圖,每個頂點有乙個權值,現在要刪除所有的葉子節點,重複此操作直至形成的 森林 中不存在葉子節點,然後找出森林中頂點個數為奇數的樹的權值的和。思路 模擬拓撲排序,每個點每連一條邊,我讓它的度數就加2,所有度數為2的點入隊,然後把這些點所連的邊刪掉,即跟它相關聯的點的度數減去2...

hdu5438 拓撲排序 dfs

題意就是現在有一片池塘,池塘之間符合無向圖的關係,每個池塘都有乙個權值。現在要刪去那些入度小於二的點,然後計算在剩下的池塘中,連線的池塘數為奇數的池塘總和。嗯,當初讀題半天沒讀懂,把樣例的資料畫一下就很清晰了。思路就是 先用拓撲排序篩選那些入度小於2的池塘,然後dfs搜尋看看每乙個連線的池塘數是不是...