CodeForces - 1408E Avoid Rainbow Cycles(思维+最大生成树)
生活随笔
收集整理的這篇文章主要介紹了
CodeForces - 1408E Avoid Rainbow Cycles(思维+最大生成树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出 m 個集合,每個集合中都有數個點,每個點的取值范圍為 [ 1 , n ] ,對于每個集合而言,其中的點互相連邊,邊的顏色為其集合的編號,每次操作可以刪除點,刪除掉第 i 個集合中的點 j 的代價為 a[ i ] + b[ j ] ,現在規定 “彩虹環” 的定義為,一條環上的所有邊的編號互不相同,現在問最少花費多少邊權進行刪點才能使得圖中不存在 “彩虹環”
題目分析:模型的話很像之前訓練的時候做過的一個最短路,也是好多個集合,每個集合中的點互相連邊:HDU - 5521
于是不難想到對于每個集合而言,建立一個虛擬節點來表示此集合中的點兩兩可達,又因為題目中給出了刪除掉每個節點的權值,所以虛擬節點與每個節點相連后的邊權就是相應的 a[ i ] + b[ j ] 了
現在考慮轉換最終的問題,也就是不存在 “彩虹環” 代表的到底是什么,因為經過了上一段的建模后,新的模型的特點是:
這樣在新圖中,如果存在環的話,那么一定是來自于不同集合的邊所造成的貢獻,所以我們只需要進行刪邊,使得新圖中不存在環即可
因為要求刪除的邊權最小,換個角度就是剩下的樹的權值盡可能大,這樣題目就轉換成了最大生成樹的問題了
代碼:
//#pragma GCC optimize(2) //#pragma GCC optimize("Ofast","inline","-ffast-math") //#pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #include<list> #include<unordered_map> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;struct Edge {int u,v;LL w;bool operator<(const Edge& t)const{return w>t.w;} }edge[N];int cnt=0;LL a[N],b[N];int f[N<<1];int find(int x) {return x==f[x]?x:f[x]=find(f[x]); }bool merge(int x,int y) {int xx=find(x),yy=find(y);if(xx!=yy){f[xx]=yy;return true;}return false; }void init() {for(int i=0;i<N<<1;i++)f[i]=i; }int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);init();int m,n;LL ans=0;scanf("%d%d",&m,&n);for(int i=1;i<=m;i++)scanf("%lld",a+i);for(int i=1;i<=n;i++)scanf("%lld",b+i);for(int i=1;i<=m;i++){int num;scanf("%d",&num);while(num--){int x;scanf("%d",&x);cnt++;edge[cnt].u=i+n;edge[cnt].v=x;edge[cnt].w=a[i]+b[x];ans+=a[i]+b[x];}}sort(edge+1,edge+1+cnt);for(int i=1;i<=cnt;i++)if(merge(edge[i].u,edge[i].v))ans-=edge[i].w;printf("%lld\n",ans);return 0; }?
總結
以上是生活随笔為你收集整理的CodeForces - 1408E Avoid Rainbow Cycles(思维+最大生成树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1408D S
- 下一篇: CodeForces - 1408F T