bzoj 2753 [SCOI2012]滑雪与时间胶囊 最小生成树
来源:互联网 发布:新秀赛季数据 编辑:程序博客网 时间:2024/05/01 03:21
如果这是一个拓扑图那么直接按拓扑序更新一遍就行了。
不过点权相等时会有双向边。
那么设f[i]表示权值比点i的权值小且可以从1到达的点到i的最小边权值。
对于每个不同的点权,将一个权值的点放在一起处理。新建一个点,对于该权值的所有点,如果这个点的f不为inf,那么从新建的点向这个点连f[i]的边,这些边和该权值的点之间的边放在一起跑kruscal。
然后把新建的点的连通块中的点和边加入答案,并用这些点和边更新其他的f。
#include <bits/stdc++.h>using namespace std;#define N 110000#define M 1100000#define ll long longint n,m,tot,ans;int a[N],f[N],fa[N],pos[N];int head[N],nex[M<<1],to[M<<1],val[M<<1];pair<int,int>b[N];ll sum,v[N];struct edge{ int x,y,v; edge(){} edge(int x,int y,int v):x(x),y(y),v(v){} friend bool operator < (const edge &r1,const edge &r2) {return r1.v<r2.v;};};vector<edge>e[N];void add(int x,int y,int z){ tot++; nex[tot]=head[x];head[x]=tot; to[tot]=y;val[tot]=z;}int find(int x){return x==fa[x] ? x:fa[x]=find(fa[x]);}int main(){ //freopen("tt.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=make_pair(-a[i],i); sort(b+1,b+1+n); for(int i=n,cnt=0;i>=1;i--) { a[i]= b[i].first==b[i+1].first ? cnt:++cnt; pos[b[i].second]=i; } for(int i=1,x,y,v;i<=m;i++) { scanf("%d%d%d",&x,&y,&v); x=pos[x];y=pos[y]; if(a[x]<a[y])swap(x,y); if(a[x]==a[y]) e[a[x]].push_back(edge(x,y,v)); else add(x,y,v); } memset(f,0x3f,sizeof(f));f[pos[1]]=0; for(int i=1,j;i<=n;i++) { for(j=i;a[j]==a[i]&&j<=n;j++);j--; for(int k=i-1;k<=j;k++)fa[k]=k,v[k]=0; int flag=0; for(int k=i;k<=j;k++) if(f[k]!=f[0]) e[a[i]].push_back(edge(i-1,k,f[k])),flag=1; if(flag) { sort(e[a[i]].begin(),e[a[i]].end()); for(int k=0;k<e[a[i]].size();k++) { edge t=e[a[i]][k]; if(find(t.x)!=find(t.y)) { v[find(t.y)]=v[find(t.x)]+v[find(t.y)]+t.v; fa[find(t.x)]=find(t.y); } } sum+=v[find(i-1)]; for(int k=i;k<=j;k++) if(find(k)==find(i-1)) { ans++; for(int t=head[k];t;t=nex[t]) f[to[t]]=min(f[to[t]],val[t]); } } i=j; } printf("%d %lld\n",ans,sum); return 0;}
0 0
- bzoj 2753 [SCOI2012]滑雪与时间胶囊 最小生成树
- bzoj 2753: [SCOI2012]滑雪与时间胶囊 最小生成树
- 【最小生成树】[SCOI2012]滑雪与时间胶囊 ski BZOJ 2753
- 【最小生成树】[Scoi2012] bzoj2753 滑雪与时间胶囊
- 【bzoj2753】【scoi2012】【滑雪与时间胶囊】【最小生成树】
- 【bzoj2753】[SCOI2012]滑雪与时间胶囊 最小生成树
- BZOJ2753: [SCOI2012]滑雪与时间胶囊(最小生成树)
- [BZOJ 2753][SCOI2012]滑雪与时间胶囊
- bzoj 2753 [SCOI2012]滑雪与时间胶囊
- BZOJ 2753 [SCOI2012] 滑雪与时间胶囊
- BZOJ 2753 [SCOI2012] 滑雪与时间胶囊 题解与分析
- 【图的遍历】【最小生成树】【SCOI2012】滑雪与时间胶囊
- 【BZOJ2753】【SCOI2012】滑雪与时间胶囊(最小生成树+层次图)
- 2753: [SCOI2012]滑雪与时间胶囊
- 2753: [SCOI2012]滑雪与时间胶囊
- BZOJ 2753 SCOI 2012 滑雪与时间胶囊 最小生成树
- 【SCOI2012】滑雪与时间胶囊
- [SCOI2012]滑雪与时间胶囊
- 集成 微信短视频 效果
- [从头学数学] 第288节 [计算几何] 多边形的布尔运算(下)
- 2013ACM/ICPC亚洲区南京站现场赛 HDU 4802 && HDU 4803 && HDU 4811 && HDU 4812
- 【codeforce 141D】Take-off Ramps 最短路问题
- BP算法
- bzoj 2753 [SCOI2012]滑雪与时间胶囊 最小生成树
- 多线程控制实例
- 第十八篇玩转【斗鱼直播APP】系列之娱乐菜单展示
- 工业应用——YouTube的视频推荐系统
- Android之QQ登录
- jsp日期格式化显示
- C语言开发环境安装——Codeblocks&GCC
- 协定类型不具有 ServiceContractAttribute 特性
- CSFR 跨站点请求伪造