hdu 5934 Bomb (強聯通分量)模板

2021-09-01 20:18:35 字數 1418 閱讀 4513

參考部落格:

題意:有n個炸彈,每個炸彈有乙個座標,乙個**範圍和乙個**花費,如果乙個炸彈的**範圍內有另外的炸彈,那麼如果該炸彈**,就會引爆所有**範圍內的炸彈,求讓所有炸彈**的最小花費。

思路:先n^2的把每個炸彈**範圍內的炸彈都連一條有向邊,然後再找強連通分量縮點,這樣會形成多個dag,然後對於每個dag找乙個入度為0的點,找這個入度為0的點裡面耗費最小的去引爆,就可以了。

在dag圖里,入度不為0的點一定可以由某個入度為0的點到達(由於無環,所以從任何入度不為0的 點往回走,必然終止於乙個入度為0的點)

**:

還要注意一點的是,建邊要是選擇的方法不同,可能會超時,見**注釋那裡,原因還未知。

#include#include#include#includeusing namespace std;

typedef long long ll;

#define inf 0x3f3f3f3f

const int maxn=1010;

struct pointp[maxn];

struct nodeedge[maxn*maxn]; ///開平方倍

int dfn[maxn],low[maxn],vis[maxn],head[maxn];

int belong[maxn],top,tot,cnt,stacks[maxn],index;

int out[maxn],in[maxn]; ///每個強聯通分量塊的出度,入度

void add(int u,int v)

///不要這樣建邊,會超時,原因未知

//void add(int x,int y)

//void tarjan(int x) ///模板

else if(vis[j]) low[x]=min(low[x],low[j]);

}if(dfn[x]==low[x])

while(item!=x);

}}int dcmp(double x)

bool dis(int u,int v)

void init()

int main()

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

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

if(!dfn[i]) tarjan(i);

for(int u=1;u<=n;u++) ///暴力列舉}}

ll sum=0;

for(int i=1;i<=cnt;i++)

}sum+=mins;}}

printf("case #%d: %lld\n",++t,sum);

}return 0;

}

HDU5934 Bomb(強連通分量分解)

題意 給出n個炸彈座標 範圍 費用,如果某乙個炸彈在另乙個炸彈的 範圍內 上 那麼該炸彈也能 問引爆所有炸彈最小的費用 思路 強連通分量分解,將所有點縮點,然後引爆所有入度為0的點即為最小費用 include include include includetypedef long long ll c...

HDU 5934 Bomb 強連通分量縮點

題意 n個炸彈都有乙個座標乙個 半徑以及乙個引爆花費,如果乙個炸彈在另乙個炸彈的 範圍內,則引爆另乙個炸彈,可以導致當前炸彈也 如果當前炸彈的 範圍有其它未炸的炸彈,那麼也能導致這些炸彈 以此聯動。思路 如果i炸彈的 範圍內有j炸彈,則建有向邊i j,然後縮一下點,每個強連通分量內只要引爆乙個,其它...

HDU 5934 Bomb (強連通分量縮點)

題解 題意 有n個炸彈,每個炸彈具有三個屬性值 座標 x,y 引爆半徑r以及引爆成本c。當引爆一枚炸彈時,這枚炸彈會同時引爆其 半徑內的所有炸彈,問引爆所有炸彈的最小成本。思路 乙個炸彈引爆另乙個炸彈可以看做是一條有向邊,那麼所有炸彈的引爆關係就是乙個有向圖。對於有向圖只要引爆入度為0的點就可以將整...