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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【牛客 - 272D】Where are you(Tarjan求桥)

發(fā)布時(shí)間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【牛客 - 272D】Where are you(Tarjan求桥) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題干:
?

小p和他的朋友約定好去游樂場(chǎng)游玩,但是他們到了游樂場(chǎng)后卻互相找不到對(duì)方了。
游樂場(chǎng)可以看做是一張n個(gè)點(diǎn),m條道路的圖,每條道路有邊權(quán)wi,表示第一次經(jīng)過該道路時(shí)的花費(fèi)(第二次及以后經(jīng)過時(shí)花費(fèi)為0)。
現(xiàn)在,小p要去找他的朋友,但他的朋友行蹤很詭異,小p總是要遍歷完這n個(gè)點(diǎn)才能找到他,同時(shí)小p希望總花費(fèi)最小。
找到朋友的方案可能不唯一(具體看樣例解釋),小p想知道在這所有的方案中,有多少條邊在每個(gè)方案中都會(huì)被經(jīng)過。
?

輸入描述:

第一行兩個(gè)整數(shù)n, m. p,分別表示點(diǎn)數(shù),邊數(shù),小p的初始位置。 接下來m行,每行兩個(gè)整數(shù)u, v, w表示從u到v有一條無向邊,邊權(quán)為w。

輸出描述:

輸出一個(gè)整數(shù)k,表示必須經(jīng)過的邊的數(shù)量。

示例1

輸入

復(fù)制

5 7 1 1 2 3 2 3 7 1 3 5 2 4 2 1 5 3 5 4 3 2 5 3

輸出

復(fù)制

2

說明

?

?

樣例解釋:

?


幾種可能的方案如下:
1?2?4?5?4?2?1?31?2?4?5?4?2?1?3
1?5?4?2?4?5?1?31?5?4?2?4?5?1?3
1?3?1?2?5?2?41?3?1?2?5?2?4
1?2?5?2?4?2?5?2?4?2?5?2?4??2?5?2?4?2?1?31?2?5?2?4?2?5?2?4?2?5?2?4??2?5?2?4?2?1?3
可以證明,4 - 2和1 - 3這兩條邊在所有方案中都被經(jīng)過。
(以上每種方案的總花費(fèi)均為13,同時(shí)可以證明沒有比這更優(yōu)的策略)

示例2

輸入

復(fù)制

3 3 1 1 2 1 1 3 1 2 3 2

輸出

復(fù)制

2

示例3

輸入

復(fù)制

3 3 1 1 2 2 2 3 2 1 3 2

輸出

復(fù)制

0

備注:

?

2?n<m?2?105,1?邊權(quán)?1062?n<m?2?105,1?邊權(quán)?106

保證圖聯(lián)通,保證無自環(huán),保證無重邊

解題報(bào)告:

? 好難的題,,不會(huì)證明但是倒是想明白了AC代碼2那里為什么else if(i!=(lstedge^1)) low[x]=min(low[x],dfn[y]);這里不能寫成 low[x]=min(low[x],low[y]);因?yàn)槟阆氚?#xff08;雖然這個(gè)題能過)。

按照這個(gè)邊的順序訪問節(jié)點(diǎn),那么當(dāng)訪問邊7的時(shí)候,LOW[3]已經(jīng)變成了2,所以如果那樣寫,那LOW[6]也變成了2.看起來是沒什么問題,但是我們看回溯到3這個(gè)節(jié)點(diǎn)的時(shí)候(注意這時(shí)候還沒訪問3->6這條邊,剛剛那是6節(jié)點(diǎn)開始的6->3這條邊),他需要開始看能否把4節(jié)點(diǎn)這一支分出去當(dāng)成一個(gè)子圖了,發(fā)現(xiàn)不行,因?yàn)镈FN[4]=2(這本是不對(duì)的,但是托了3->2這條邊優(yōu)先訪問的福啊!就把狀態(tài)弄成這樣了)然后再遍歷3->6這個(gè)節(jié)點(diǎn),發(fā)現(xiàn)也不行,因?yàn)镈FN[6]=2,然后無奈返回,并且不標(biāo)記成是個(gè)割點(diǎn),,但是很顯然,3這個(gè)點(diǎn)就是個(gè)割點(diǎn)!!!這就是為什么板子要這么寫!!

對(duì)于題目:

AC代碼:?

#include<bits/stdc++.h> using namespace std; const int maxn=200050; int root,sum=1,dfn[maxn],low[maxn],ans[maxn],f[maxn]; int getf(int u){return f[u]==u?u:f[u]=getf(f[u]);} struct Ed{int u,v,w;bool operator<(const Ed &A)const{return w<A.w; } }E[maxn]; struct Edge{int v,id,next;}e[maxn*2]; int first[maxn],tot; void add(int u,int v,int id){e[tot].v=v;e[tot].id=id;e[tot].next=first[u];first[u]=tot++; } void tarjin(int u,int last){dfn[u]=low[u]=sum++;for(int i=first[u];~i;i=e[i].next){int v=e[i].v;if(i==(1^last))continue;if(dfn[v]){low[u]=min(low[u],dfn[v]);}else{tarjin(v,i);low[u]=min(low[u],low[v]);if(low[v]>dfn[u])ans[e[i].id]=1;}} } int main(){int i,j,n,m,p,u,v,w;scanf("%d%d%*d",&n,&m);tot=0;memset(first,-1,sizeof(first));for(i=1;i<=n;++i)f[i]=i;for(i=0;i<m;++i){scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w);}sort(E,E+m);for(i=0;i<m;++i){j=i;while(j+1<m&&E[j+1].w==E[i].w)j++;tot=0;for(int k=i;k<=j;++k){int fu=getf(E[k].u),fv=getf(E[k].v);if(fu!=fv){add(fu,fv,k);add(fv,fu,k);}}for(int k=i;k<=j;++k){int fu=getf(E[k].u),fv=getf(E[k].v);if(fu==fv || dfn[fu]) continue;tarjin(fu,-1);}for(int k=i;k<=j;++k){int fu=getf(E[k].u),fv=getf(E[k].v);if(fu==fv)continue;first[fu]=first[fv]=-1;dfn[fu]=dfn[fv]=0;f[fu]=fv;}i=j;}int h=0;for(i=0;i<m;++i)h+=ans[i];cout<<h<<endl;return 0; }

AC代碼2:

#include<bits/stdc++.h> using namespace std; #define maxn 200001 #define maxm 300001 struct edge {int a,b,c;int id;inline void read(int _id){scanf("%d%d%d",&a,&b,&c);id=_id;}bool operator <(const edge &p)const{return c<p.c;} }e[maxm]; int n,m; inline void init() {int p;scanf("%d%d",&n,&m);scanf("%d",&p);for(int i=1;i<=m;i++) e[i].read(i);sort(e+1,e+m+1); } int head[maxn],nxt[maxm<<1],ver[maxm<<1],id[maxm<<1],tot; inline void addedge(int a,int b,int _id) {nxt[++tot]=head[a];ver[tot]=b;id[tot]=_id;head[a]=tot;nxt[++tot]=head[b];ver[tot]=a;id[tot]=_id;head[b]=tot; } int ans[maxm];int dfn[maxn],low[maxn],cnt; inline void tarjan(int x,int lstedge) {dfn[x]=low[x]=++cnt;for(int i=head[x];i;i=nxt[i]){int y=ver[i];if(!dfn[y]){tarjan(y,i);low[x]=min(low[x],low[y]);if(low[y]>dfn[x]) ans[id[i]]=666;}else if(i!=(lstedge^1)) low[x]=min(low[x],dfn[y]);} } int fa[maxn];inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} int main() {init();for(int i=1;i<=n;i++) fa[i]=i;int Nowedge=1;while(Nowedge<=m){int L=Nowedge,R=Nowedge;while(R+1<=m&&e[R].c==e[R+1].c) R++;Nowedge=R+1;cnt=0;tot=1;for(int i=L;i<=R;i++){int a=find(e[i].a),b=find(e[i].b);head[a]=0;head[b]=0;dfn[a]=dfn[b]=low[a]=low[b]=0;}for(int i=L;i<=R;i++){int a=find(e[i].a),b=find(e[i].b);if(a==b){ans[e[i].id]=-1;continue;}ans[e[i].id]=233;addedge(a,b,e[i].id);}for(int i=L;i<=R;i++){if(!dfn[find(e[i].a)]) tarjan(find(e[i].a),0);if(!dfn[find(e[i].b)]) tarjan(find(e[i].b),0);}for(int i=L;i<=R;i++) fa[find(e[i].a)]=find(e[i].b);}int ttl = 0;for(int i=1;i<=m;i++){if(ans[i]==666) ttl++;}cout<<ttl<<endl;return 0; }

AC代碼3:

#include<bits/stdc++.h> using namespace std; const int N=2e5+10; struct edge{int f,to,v;}a[N]; struct node{int to,id;}; bool cmp(edge a,edge b){return a.v<b.v;} int fa[N];vector<node>g[N]; int dfn[N],low[N],num;int ans[N]; int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} void unite(int x,int y){x=find(x),y=find(y),fa[x]=y;} void tarjan(int x,int fa){dfn[x]=low[x]=++num;for(auto it:g[x]){int u=it.to,id=it.id;if(id==fa) continue;if(!dfn[u]){tarjan(u,id);low[x]=min(low[x],low[u]);if(dfn[x]<low[u]) ans[id]=1;}else low[x]=min(low[x],dfn[u]);} } int main(){int n,m,q,x,y,c;scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].f,&a[i].to,&a[i].v);sort(a+1,a+m+1,cmp);for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++){int s=i;while(a[i+1].v==a[i].v) i++;for(int j=s;j<=i;j++){x=find(a[j].f),y=find(a[j].to);if(x==y) continue; g[x].push_back({y,j});g[y].push_back({x,j});}for(int j=s;j<=i;j++){x=find(a[j].f),y=find(a[j].to);if(x==y||dfn[x]) continue;tarjan(x,0);}for(int j=s;j<=i;j++){x=find(a[j].f),y=find(a[j].to);dfn[x]=dfn[y]=0;g[x].clear(),g[y].clear();unite(x,y);}num=0;}int out=0;for(int i=1;i<=m;i++) if(ans[i]) out++;printf("%d\n",out);return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的【牛客 - 272D】Where are you(Tarjan求桥)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 午夜看看 | 波多野结衣亚洲一区二区 | 日本一二三区不卡 | 国产精品黄在线观看 | 人妻精品久久久久中文字幕69 | 这里只有精品22 | 国产麻豆一精品一av一免费 | 捆绑中国女人hd视频 | 欧美一区二区三区在线播放 | 日韩欧美成人一区二区三区 | 已婚少妇美妙人妻系列 | 精品裸体舞一区二区三区 | 免费观看国产精品视频 | 筱田优全部av免费观看 | 天天综合一区 | 午夜久久 | 秘密基地动漫在线观看免费 | 日韩精品1区2区3区 欧美一本 | 色二区| 一级片免费网址 | 日韩不卡视频在线观看 | 国产av一区二区三区传媒 | 亚洲女则毛耸耸bbw 边吃奶边添下面好爽 | 久久久久久蜜桃 | 黄色第一网站 | 3d动漫精品啪啪一区二区免费 | 中文字幕第12页 | 嫩草www| 欧美另类自拍 | 在线观看麻豆av | 亚洲av成人精品一区二区三区在线播放 | 亚洲精品成人无码 | 黄页网站免费观看 | 好吊妞视频在线 | 亚洲美女中文字幕 | 精品三级av | 30一40一50老女人毛片 | 国产亚洲视频一区 | 国产精品九九热 | 粉嫩小箩莉奶水四溅在线观看 | www.四虎. | 亚洲专区第一页 | 天天干 夜夜操 | 成人福利在线视频 | 天天干天天操天天爱 | 欧美精品久久久久久久免费 | 亚洲AV无码成人精品国产一区 | 久久综合九九 | 免费看一级黄色大片 | 91中文字日产乱幕4区 | www.超碰97| 制中文字幕音影 | 四虎在线视频 | 中文字幕黄色av | 99免费视频 | 99热这里只有精品9 日韩综合在线 | 校园春色综合 | 久久无码专区国产精品s | 国产男女精品 | 四虎com| 波多野结衣一区二区三区高清av | 日韩无码电影 | 日日夜夜91| 91口爆一区二区三区在线 | 老司机久久精品视频 | 日本一级吃奶淫片免费 | 毛片黄色一级 | 午夜在线免费视频 | 久久久蜜桃一区二区 | 欧美第五页 | 麻豆传媒网址 | 夜夜躁很很躁日日躁麻豆 | 久久婷婷综合国产 | 99久久精品一区二区三区 | 日韩另类在线 | 国产男女精品 | 99久久国| 日本a区 | 色久月 | 亚洲中文字幕无码一区 | 少妇天堂网 | 中国吞精videos露脸 | 波多野结衣中文字幕在线播放 | 欧美精品xx| 男人天堂视频在线 | 自拍偷拍亚洲视频 | 麻豆精品在线播放 | 性综合网 | 免费观看视频一区二区 | 在线免费看毛片 | 亚洲精品99久久久久中文字幕 | 一级黄色片视频 | 日韩欧美激情视频 | 欧美午夜一区二区 | 超清纯大学生白嫩啪啪 | 午夜精品久久久久久久久久久久久 | 亚洲午夜av在线 | 亚洲欧美日韩国产成人精品影院 | 黑人巨大精品 |