P6134 JSOI2015 最小表示

2022-09-15 00:42:28 字數 1106 閱讀 7497

p6134 [jsoi2015]最小表示

yhx's blog

給定乙個有向圖無環,問最多可以刪去多少條邊使得圖的連通性不變。

首先考慮在什麼情況下會被刪:假設邊\((u,v)\),那麼當且僅當存在乙個\(w\),使得 \(u\) 可以到達 \(w\) ,且 \(w\) 可以到達 \(v\) 。

也就是說我們考慮「繞路」。

但是,我們怎麼知道這個 \(w\) 的存在呢?——我們可以維護每乙個點到其他點的連通性。

但是我們如果遍歷的先後順序有影響呢?不就統計不到了嗎?

所以我們有下面這樣的性質:統計乙個點延伸出去的最長路,然後先訪問最長路長的點。

為什麼呢?——因為長的點有可能到達短的點,而短的點不可能到達長的點。

正確性顯然。

然後有向圖連通性明顯使用 bitset 來優化,時間複雜度 \(o(\frac)\)

**:

#includeusing namespace std;

template inline void read(t &x)

template inline void write(t x)

#define ll long long

const int n=3e4+5,m=1e5+5;

int head[n],nex[m],to[m],idx,vec[n],dist[n];

int n,m,ans;

bool vis[n];

bitsets[n];

void add(int u,int v)

bool cmp(int x,int y)

void dfs(int x)

for(int i=head[x];i;i=nex[i])

sort(vec+1,vec+top+1,cmp);

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

return ;

}signed main()

for(int i=1;i<=n;i++) s[i][i]=1;

for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);

write(ans);

return 0;

}

JSOI2015 最小表示

題目大意 盡可能多地去掉乙個有向無環圖上的邊,使得圖的連通性不變。思路 拓撲排序,然後倒序求出每個結點到出度為 0 的點的距離 d 再倒序遍歷每乙個點 x 以 d 為關鍵字對其出邊降序排序,嘗試加入每一條邊,若加邊之前兩點已經連通,則說明這條邊可以刪去。可以用bitset維護圖的連通性,注意原圖是有...

bzoj4484 jsoi2015 最小表示

time limit 20 sec memory limit 512 mb submit 432 solved 223 submit status discuss 故事背景 還記得去年jyy所研究的強連通分量的問題嗎?去年的題目裡,jyy研究了對於有向圖的 加邊 問題。對於圖論有著強烈興趣的jyy,...

bzoj4484 JSOI2015 最小表示

給出一張dag,要求刪除盡量多的邊使得連通性不變.即 若刪邊前u到v有路徑,則刪邊後仍有路徑 點數30000,邊數100000.如果從u到v有 u,v 這條邊,且從u到v只有這一條路徑,那麼這條邊必須保留.否則這條邊一定可以刪除.因為如果有不止一條路徑從u到v,必然存在點x x u,x v 使得u可...