給出一張dag,要求刪除盡量多的邊使得連通性不變.(即:若刪邊前u到v有路徑,則刪邊後仍有路徑).點數30000,邊數100000.
如果從u到v有(u,v)這條邊,且從u到v只有這一條路徑,那麼這條邊必須保留.否則這條邊一定可以刪除.因為如果有不止一條路徑從u到v,必然存在點x(x!=u,x!=v)使得u可到達x,x可到達v.而刪邊後必然也滿足u可到達x,x可到達v,所以直接刪掉(u,v)這條邊就可以了.
剛才的分析已經給出了乙個判定方法.既然如果有不止一條路徑從u到v,必然存在點x(x!=u,x!=v)使得u可到達x,x可到達v,那麼我們對每條邊(u,v),列舉是否存在這樣的x即可.這需要我們求出每個點能到達的點的集合,以及能到達這個點的集合.大力壓位一波就好了.因為是dag所以這個集合可以遞推.複雜度o(nm/32).
其實這題是看記憶體猜演算法系列,榜上清一色的120多兆,不是壓位還能是啥
我是200多兆
#includeconst int mod=1000000007;
const int maxn=30005,maxm=200005;
struct edgelst[maxm],lst2[maxm];int len=1,first[maxn],len2=1,first2[maxn];
void addedge(int a,int b)
void addedge2(int a,int b)
int sz;
int reach[maxn][maxn/32+2],from[maxn][maxn/32+2];
int getbit(int u,int x)
void revbit(int u,int x)
void revbit2(int u,int x)
bool vis[maxn];
void dfs(int x)
revbit(x,x);
}void dfs2(int x)
revbit2(x,x);
}int main()
for(int i=1;i<=n;++i)if(!vis[i])dfs(i);
for(int i=1;i<=n;++i)vis[i]=0;
for(int i=1;i<=n;++i)if(!vis[i])dfs2(i);
for(int i=1;i<=n;++i)revbit(i,i),revbit2(i,i);
int ans=0;
for(int i=1;i<=n;++i)}}
} printf("%d\n",ans);
return 0;
}
bzoj4484 jsoi2015 最小表示
time limit 20 sec memory limit 512 mb submit 432 solved 223 submit status discuss 故事背景 還記得去年jyy所研究的強連通分量的問題嗎?去年的題目裡,jyy研究了對於有向圖的 加邊 問題。對於圖論有著強烈興趣的jyy,...
Bzoj4484 Jsoi2015 最小表示
time limit 20 sec memory limit 512 mb submit 103 solved 65 故事背景 還記得去年jyy所研究的強連通分量的問題嗎?去年的題目裡,jyy研究了對於有向圖的 加邊 問題。對於圖論有著強烈興趣的jyy,今年又琢磨起了 刪邊 的問題。問題描述 對於乙...
小店購物 JSOI2008 BZOJ 2260
grant是乙個個體戶老闆,他經營的小店因為其豐富的優惠方案深受附近居民的青睞,生意紅火。小店的優惠方案十分簡單有趣。grant規定 在一次消費過程中,如果您在本店購買了精製油的話,您購買香皂時就可以享受2.00元 塊的 如果您在本店購買了香皂的話,您購買可樂時就可以享受1.50元 聽的 諸如此類的...