麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設計 > 正文

PrayerOJ1823: 每條邊的最小生成樹

2019-11-11 05:01:08
字體:
來源:轉載
供稿:網友

http://PRayer.hustoj.com/problem.php?id=1823 CF上好像也有題 這題其實蠻巧妙的 顯然暴力的代碼也難搞 那我直接說標算了; 吧原圖的最小生成樹搞出來 對于詢問 如果邊不在我們求出來的最小生成樹上,那一定會形成一個環(huán) 我們只要把環(huán)里除詢問邊外最長的邊刪掉就可以了 妥妥的; 但是證明去找到最長邊呢 我第一個反應就是暴力; 后來zyy大佬說用lca 對啊 如果我們把詢問邊砍掉 就是破環(huán) lac其兩個端點,必然會訪問其環(huán)上的各個邊 所以在搞倍增表時,隨手搞一個倍增max表就好了

#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#include<cstring>#include<string>#define Ll long longusing namespace std;struct cs{ int x,y,z,num;}a[10001],aa[10001];//讀入a,aa備份 int g[1001][1001],deep[1001],bz[1001][15],ma[1001][15];//g來存最小生成樹,ma就是倍增max bool b[10001];//表示邊i在不在原來的最小生成樹里 int father[1001];//我用kruskalint n,m,xx,yy,ans,start;bool cmp(cs a,cs b){ return a.z<b.z;}int getfa(int x){ if(father[x]==x)return x; father[x]=getfa(father[x]); return father[x];}void dfs(int x,int y,int z){ deep[x]=z; bz[x][0]=y; ma[x][0]=g[x][y]; for(int i=1;i<=n;i++) if(g[i][x]>0&&i!=y)dfs(i,x,z+1);}void bzb(){ for(int j=1;(1<<j)<=n;j++) for(int i=1;i<=n;i++){ bz[i][j]=bz[bz[i][j-1]][j-1]; ma[i][j]=max(ma[i][j-1],ma[bz[i][j-1]][j-1]); }}void happytogether(int x,int y){ if(x==y)return; while(1){ int j=0; if(bz[x][j]==bz[y][j]){ xx=max(xx,ma[y][j]); xx=max(xx,ma[x][j]); return; } while(bz[x][j]!=bz[y][j])j++; j--; xx=max(xx,ma[y][j]); xx=max(xx,ma[x][j]); x=bz[x][j]; y=bz[y][j]; }}int upone(int stdd,int x){ while(deep[x]!=stdd){ int j=0; while(deep[bz[x][j]]>=stdd)j++; xx=max(xx,ma[x][j-1]); x=bz[x][j-1]; } return x;}void lca(int x,int y){ if(deep[x]>deep[y])swap(x,y); y=upone(deep[x],y); happytogether(x,y);} main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z); a[i].num=i; aa[i].x=a[i].x;aa[i].y=a[i].y;aa[i].z=a[i].z; } sort(a+1,a+m+1,cmp); for(int i=1;i<=n;i++)father[i]=i; for(int i=1;i<=m;i++){ xx=getfa(a[i].x); yy=getfa(a[i].y); if(xx==yy)continue; ans+=a[i].z; father[xx]=yy; b[a[i].num]=1; g[a[i].y][a[i].x]=g[a[i].x][a[i].y]=a[i].z; start=a[i].x; } dfs(start,0,1); bzb(); for(int i=1;i<=m;i++) if(b[i])cout<<ans<<endl;else{ xx=0; lca(aa[i].x,aa[i].y); cout<<ans-xx+aa[i].z<<endl; }}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人黄色短视频在线观看 | 鲁丝一区二区二区四区 | 欧美成人精品一区二区男人小说 | 精品中文字幕久久久久四十五十骆 | 色综合久久久久久久久久久 | 成人免费在线网 | 国产精品久久久久久久午夜片 | 色播一区| 蜜桃网站在线观看 | 宅男视频在线观看免费 | 国产精品一区二区三区在线 | 7m视频成人精品分类 | 91成人久久 | 精品久久久久久国产 | 色婷婷久久久 | 国产午夜精品久久久久久久蜜臀 | 亚洲一区在线免费视频 | 一级黄色大片在线观看 | 精品中文字幕在线播放 | 国产精品久久久av | 国产三级精品最新在线 | 男女羞羞的视频 | 91九色免费视频 | 国产人成免费爽爽爽视频 | 天天夜夜操操 | 欧美成人免费电影 | 国产三级国产精品国产普男人 | 国产v综合v亚洲欧美久久 | 国内精品久久久久久久影视红豆 | 国产高清自拍一区 | 精品国产一区在线观看 | 手机免费看一级片 | 91久久久久久久久久久久久久 | 国产在线地址 | 国产亚洲美女精品久久久2020 | 国产伦精品一区二区三区 | 久久久久av69精品 | 中文字幕爱爱视频 | 成人免费一区二区三区在线观看 | 国产九色在线播放九色 | 久久久久久久久久亚洲 |