日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

How far away ? HDU - 2586

發(fā)布時間:2025/4/16 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 How far away ? HDU - 2586 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊打開鏈接1??點擊打開鏈接2

?理解這個算法一定要抓住`遞推`的思想(也有遞歸在里面,?也要抓住).
????Tarjan是利用并查集實現(xiàn)的,?在遞推過程中,?一棵樹的root節(jié)點代表這棵樹(聯(lián)系并查集來想),?這樣做的好處是,?如果問點i與j的lca,?我們只要找i,j都屬于的最小的哪棵子樹就行了,?因為該子樹就是我們的答案.?那如何確定是那顆子樹呢??這一點后面再解釋一下.

????下面說Tarjan最巧妙的點了.?因為是在建樹的過程中計算所有query,?也就表示我們此刻是否能計算某一query對(u,v)的條件是?:?u和v是否都已經(jīng)遍歷過.?所以我們可以在遍歷到點v(假設(shè)經(jīng)歷v的時間比u晚)的時候把query給計算出來.?比如lcm(u,v)就是find(u).?那此刻的find(v)和lcm(u,v)相不相等呢??答案是不相等,?至少在我的代碼實現(xiàn)上不相等.?因為father[x]的更新是在`遞歸回去`的時候更新的,?而此刻在遍歷v點,?還沒遞歸回去呢,?father[v]當(dāng)然也就沒更新啦.點擊打開鏈接 3

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int maxn=40010; struct node {int from,to,weight,lca,next; }edge[maxn*2],qedge[maxn]; int first[maxn],qfirst[maxn],index,index1; int m,n; int father[maxn],vis[maxn],dist[maxn],res[maxn][3]; void init() {memset(vis,0,sizeof(vis));memset(dist,0,sizeof(dist));memset(first,0,sizeof(first));memset(qfirst,0,sizeof(qfirst));index=index1=1; } void add(int u,int v,int w) {edge[index].to=v;edge[index].weight=w;edge[index].next=first[u];first[u]=index++; } void qadd(int u,int v,int w) {qedge[index1].to=v;qedge[index1].weight=w;qedge[index1].next=qfirst[u];qfirst[u]=index1++; } int Find(int x) {// if(father[x]==x)// return x;// return father[x]=Find(father[x]);int root=x;while(root!=father[root])root=father[root];int j;while(root!=father[x]){j=father[x];father[x]=root;x=j;}return root; } void tarjan(int u) {vis[u]=1;father[u]=u;for(int i=first[u];i;i=edge[i].next){int v=edge[i].to;if(!vis[v]){dist[v]=dist[u]+edge[i].weight;tarjan(v);//Union(u,v);father[v]=u;// cout<<v<<"father :"<<father[u]<<endl;}}for(int i=qfirst[u];i;i=qedge[i].next){int v=qedge[i].to;if(vis[v]){res[qedge[i].weight][2]=Find(v);//最近的公共祖先// cout<<res[i][0]<<" and "<<res[i][1]<<" lca :"<<res[i][2]<<endl;}} } int main() {int T;int u,v,w;scanf("%d",&T);while(T--){init();scanf("%d%d",&n,&m);for(int i=1;i<n;i++){scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}for(int i=0;i<m;i++){scanf("%d%d",&u,&v);qadd(u,v,i);qadd(v,u,i);res[i][0]=u;res[i][1]=v;}dist[1]=0;tarjan(1);for(int i=0;i<m;++i){//cout<<res[i][2]<<" ";printf("%d\n",dist[res[i][0]]+dist[res[i][1]]-2*dist[res[i][2]]);}}return 0; } /* 1 11 3 1 2 1 1 3 2 2 5 3 3 6 4 5 8 5 5 9 6 6 10 7 6 11 8 2 4 1 3 7 2 8 9 10 11 9 10 */wa的一個: #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int maxn=40010; struct node {int from,to,weight,lca,next; }edge[maxn*2],qedge[maxn]; int first[maxn],qfirst[maxn],index,index1; int m,n; int father[maxn],vis[maxn],dist[maxn]; void init() {memset(vis,0,sizeof(vis));memset(dist,0,sizeof(dist));memset(first,-1,sizeof(first));memset(qfirst,-1,sizeof(qfirst));index=index1=0; } void add(int u,int v,int w) {edge[index].to=v;edge[index].weight=w;edge[index].next=first[u];first[u]=index++; } void qadd(int u,int v) {qedge[index1].from=u;qedge[index1].to=v;qedge[index1].lca=-1;qedge[index1].next=qfirst[u];qfirst[u]=index1++; } int Find(int x) {if(father[x]==x)return x;return father[x]=Find(father[x]); } void Union(int x,int y) {x=Find(x);y=Find(y);if(x!=y)father[y]=x; } void tarjan(int u) {vis[u]=1;father[u]=u;//ance[u]=father[u]=u;for(int i=first[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(!vis[v]){dist[v]=dist[u]+edge[i].weight;tarjan(v);//Union(u,v);father[v]=u;}}for(int i=qfirst[u];i!=-1;i=qedge[i].next){int v=qedge[i].to;if(vis[v]){if(v%2){qedge[i+1].lca=qedge[i].lca=Find(v);}elseqedge[i].lca=qedge[i-1].lca=Find(v);//ance[Find(v)];}} } int main() {int T;scanf("%d",&T);while(T--){init();scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}for(int i=0;i<m;i++){int u,v;scanf("%d%d",&u,&v);qadd(u,v);qadd(v,u);}dist[1]=0;tarjan(1);for(int i=0;i<m;++i){int j=i*2;int u=qedge[j].from;int v=qedge[j].to;int lca=qedge[j].lca;printf("%d\n",dist[u]+dist[v]-2*dist[lca]);}}return 0; }
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的How far away ? HDU - 2586的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: kk视频在线观看 | 中文字幕日韩精品亚洲一区小树林 | 色翁荡息又大又硬又粗又爽 | 日本一道本 | 美女免费福利视频 | 亚洲国产日韩一区无码精品久久久 | 夜夜骑夜夜骑 | 操日本老太太 | 老熟妇毛片 | 91最新入口 | 四季av日韩精品一区 | 国产麻豆精品久久一二三 | 九色视频丨porny丨丝袜 | 精品亚洲一区二区三区 | 欧美大片免费 | 欧美日韩精品一区二区三区四区 | 日韩欧美一级 | 超碰神马| 波多野结衣国产 | 亚洲精品 欧美 | 欧美成人黑人xx视频免费观看 | 东凛在线观看 | 三级黄网 | 国产精品xxxx | 好吊色视频988gao在线观看 | 岛国av免费在线 | 日韩精品视频在线 | 欧美精品免费一区二区 | 色综网 | 五月婷婷亚洲综合 | 91免费国产在线观看 | 亚洲精品中文字幕乱码三区 | 国产视频一区二区在线播放 | 一卡二卡在线观看 | 97影院 | 国产中出 | 91精品久久久久久久久 | 成人福利视频在线 | 91免费播放 | 99精品一区二区三区无码吞精 | 91成人动漫 | 九色porny自拍视频 | 极品尤物在线观看 | 午夜诱惑痒痒网 | 欧美日韩中文一区 | 亚洲红桃视频 | 欧美性猛交乱大交xxxx | 亚洲精品久久久久中文字幕二区 | 日本人妻一区 | 影音先锋激情 | 少妇献身老头系列 | 天堂网av在线播放 | 人妻91麻豆一区二区三区 | 国产三级视频在线播放 | 国产乱色| 国产成人精品一区二区在线小狼 | 日韩精品一区二区三区色欲av | 亚洲一区二区精品在线 | 15p亚洲 | 久久综合五月婷婷 | 羞羞的视频网站 | 浓精喷进老师黑色丝袜在线观看 | 午夜性福利视频 | 久热精品在线观看 | 成年人视屏 | 国产美女视频一区 | 国产好片无限资源 | 国产精品一区不卡 | 91视频地址| 亚洲视频 欧美视频 | 在线视频啪 | 丰满人妻一区二区三区53号 | 绯色av蜜臀vs少妇 | 美女视频黄色 | 麻豆精品自拍 | 特黄色一级片 | 国产精品五区 | 999视频在线播放 | 日本xxxx裸体xxxx | 色综合色综合色综合 | 日韩黄色录像 | 中日韩精品在线 | 性歌舞团一区二区三区视频 | 涩涩屋视频 | 人妖粗暴刺激videos呻吟 | 亚洲 欧美 日韩系列 | 9l视频自拍九色9l视频成人 | 久久人体视频 | 青青视频免费观看 | 最新最近中文字幕 | 91久久精品一区二区别 | 少妇性l交大片 | 翔田千里一区 | 91人人澡人人爽 | 欧美国产精品 | 精品裸体舞一区二区三区 | 久久99综合 | 伊人天堂网 | 亚洲区在线 |