題意:
有個人有p個池塘,每乙個池塘有其價值,池塘之間有連線的管道,現在主人由於資金的問題,需要拋棄一些池塘,其特點是與之相鄰的池塘只有乙個,當然如果刪除了乙個池塘之後剩下的池塘仍然有類似的池塘還要接著刪除。
刪除之後,問連通圖中池塘的個數為奇數個的連通圖所有池塘的價值和。
思路:
記錄每乙個池塘所連線的邊,其實也就是入度,此題的邊是雙向的,所以直接記錄即可。
然後不停的迴圈刪除入度只有0或者1的點,最多刪除p次。
刪除之後就是查詢剩下的點的價值和,對於不同的連通圖直接用bfs找出所有即可,這裡可以也用dfs。
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 1e5+10;
typedef
long
long ll;
int t,p,m;
int val[maxn];
int topsort[maxn],vis[maxn];
vector
g[10005];
/*ll bfs(int u)}}
if(num >= 3 && num%2) return sum;
return 0;}*/
ll sum;
int num;
void dfs(int u)
}}int main()
for(int i = 1;i <= m; i++)
for(int i = 1;i <= p; i++)
if(j > p) break;
int size = g[j].size();
topsort[j] = -1;
for(int k = 0;k < size; k++)
}ll ans = 0;
for(int i = 1;i <= p; i++)
}printf("%lld\n",ans);
}return
0;}
hdu5438(拓撲排序 dfs)
題意 p個頂點m條邊的無向圖,每個頂點有乙個權值,現在要刪除所有的葉子節點,重複此操作直至形成的 森林 中不存在葉子節點,然後找出森林中頂點個數為奇數的樹的權值的和。思路 模擬拓撲排序,每個點每連一條邊,我讓它的度數就加2,所有度數為2的點入隊,然後把這些點所連的邊刪掉,即跟它相關聯的點的度數減去2...
hdu5438 拓撲排序 dfs
題意就是現在有一片池塘,池塘之間符合無向圖的關係,每個池塘都有乙個權值。現在要刪去那些入度小於二的點,然後計算在剩下的池塘中,連線的池塘數為奇數的池塘總和。嗯,當初讀題半天沒讀懂,把樣例的資料畫一下就很清晰了。思路就是 先用拓撲排序篩選那些入度小於2的池塘,然後dfs搜尋看看每乙個連線的池塘數是不是...
hdu 5438 Ponds(拓撲應用 DFS)
題目大意 p個池塘 m個連同渠 p個池塘的價值 m個連通渠的u與v 小於兩個連同渠的池塘去掉。找到剩餘的連通的池塘,並且只加連通的池塘的總個數為奇數個的連通塊的價值。詳見 寫的很繁瑣很差勁,哎,但還是分享下吧。include include include include includeusing ...