zoj 3261connections in galaxy war
題目大意:銀河中一些星球之間有通道可以聯絡,然而另乙個維度的怪物將某些聯絡破壞了。因此當有些星球需要幫助時,就需要判斷一下能不能找到乙個直接或間接聯絡的星球,並且這個星球的力量是與該星球連線的所有星球中最大的。如果有這麼乙個星球,則輸出該星球的編號,如果有多個星球是最大的,輸出編號最小的那個。如果找不到這樣的星球,則輸出「-1」。
在輸入中,首先輸入星球個數n,第二行是n個數,表示每個星球的力量。下一行是乙個整數m,表示所有的聯絡個數,下面是m行,每行兩個整數,表示哪兩個星球有聯絡。下一行是乙個整數q,表示處理個數,有兩種情況:
第一種是:destroy a b 表示摧毀a,b之間的聯絡
第二種是:query a 表示詢問a星球能否得到幫助
ac**:
#include
#include
#include
#include
#include
using
namespace std;
const
int max=
10001
;int power[max]
;//每個行星的戰鬥力
map<
int,
int>mp[max]
;//存邊,以及邊的編號
int used[
2*max]
;//與map相結合,記錄哪條邊需要刪除
int parent[max]
;int ans[
5*max]
;int n;
struct edge//記錄邊,方便通過下標查詢連線兩個邊的節點
edges[
2*max]
;struct ques//記錄問題,如果是destroy ,mark 記為1,如果是query,mark記為0
que[
5*max]
;struct re//要求的最大力量和最小的編號
res[max]
;void
init()
//初始化
}int
find_root
(int x)
void
unite
(int x,
int y)
else
if(res[x]
.height==res[y]
.height&&res[x]
.num.num)
res[y]
.num=res[x]
.num;}}
intmain()
int q;
scanf
("%d"
,&q)
;for
(int i=
0;i)else
}for
(int i=
0;i)//將沒被刪除的邊先合併成集合
int t=0;
for(
int i=q-
1;i>=
0;i--
)else
unite
(que[i]
.x,que[i]
.y);
//將刪除邊轉化為合併邊
}for
(int i=t-
1;i>=
0;i--
)printf
("%d\n"
,ans[i]);
}}
hdoj 4496d-city
題目大意:乙個怪獸要把整個d城的聯絡全部摧毀,題目要求輸出在摧毀乙個聯絡時還剩多少分塊。當且僅當它們直接或間接地彼此連線時,兩個點在相同的連線塊中。
題解:同上題一樣,離線處理,只不過這題比較簡單,因為是「全部摧毀」,所以在最後總是輸出節點個數。這題用二維陣列存邊,開乙個 edge[max][2] 陣列,聯絡的第乙個數存在edge[i][0]裡,第二個數存在edge[i][1]裡(這種存邊方法好巧妙哦~, 原諒乙個菜鳥沒見過世面 )。
ac**:
#include
#include
#include
using
namespace std;
const
int max=
10001
;int parent[max]
;int edge[
10*max][2
];int ans[
10*max]
;int n,m;
void
init()
}int
find_root
(int x)
bool
unite
(int x,
int y)
return
false;}
intmain()
for(
int i=m-
1;i>=
0;i--
)for
(int i=
0;i)printf
("%d\n"
,ans[i]);
}}
逆向並查集(ZOJ 3261)
與並查集不同,給出乙個圖中原有的一些邊,然後給出操作,操作不是向圖中新增邊,而是在已有的邊上,將邊刪除。對於該種情況,需要把首先讀入所有操作,把要求刪除的邊全部刪除,再按照從後往前的順序處理操作,這樣刪邊操作又重新轉化為了添邊的操作。例題 zoj3261 connections in galaxy ...
zoj 3261 逆向並查集
很明顯是逆向的並查集,建立邊再銷毀,思路也很巧妙的逆向思考 如果正著一一銷毀,相當於倒著一一建邊。所以儲存q次提問,最後倒著來一一建邊。在此之前先把沒有銷毀的邊全部建好 細節power能量注意一下 view code 1 include 2 include 3 include 4 include 5...
zoj3261變形並查集
需要變形的並查集,這題錯了好久,一直沒a掉,終於在重寫第三次的時候a了 先儲存資料,把不需要拆分的邊合併,逆向計算,需要拆分時就合併,之前不知道為啥寫搓了,tle好久 include include include include include include include include in...