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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU4514(非连通图的环判断与图中最长链)

發(fā)布時(shí)間:2024/4/11 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU4514(非连通图的环判断与图中最长链) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:設(shè)計(jì)風(fēng)景線

?

題意:給定一個(gè)無向圖,圖可能是非連通的,如果圖中存在環(huán),就輸出YES,否則就輸出圖中最長鏈的長度。

?

分析:首先我們得考慮這是一個(gè)無向圖,而且有可能是非連通的,那么就不能直接像求樹那樣來求最長鏈。對于本題,首先得

判斷環(huán),在這里我們就用并查集判環(huán),因?yàn)椴⒉榧旧砭褪菢湫徒Y(jié)構(gòu),如果要連接的兩點(diǎn)的祖先都相同,那么就已經(jīng)有環(huán)了,

這樣直接輸出YES,如果沒有環(huán),就應(yīng)該輸出最長鏈長度,那么我們每次可以對每一個(gè)沒有訪問過的節(jié)點(diǎn)進(jìn)行兩次bfs,就可以

出,然后每次更新最大值即可。

?

#include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> #include <queue>using namespace std;const int N=100005; const int M=2000005;int pre[N],n,m,res; int head[N],to[M],next[M],w[M],edge; int tosum[N],dis[N],que[N]; bool vis[N],used[N]; queue <int>Q;void init() {edge=0;memset(head,-1,sizeof(head));memset(used,0,sizeof(used));for(int i=1;i<=n;i++)pre[i]=i; }int find(int x) {int r=x;while(r!=pre[r])r=pre[r];//路徑壓縮int i=x,j;while(i!=r){j=pre[i];pre[i]=r;i=j;}return r; }void Union(int x,int y) {int fx = find(x);int fy = find(y);if(fx!=fy) pre[fx]=fy; }void add(int u,int v,int c) {to[edge]=v,w[edge]=c,next[edge]=head[u],head[u]=edge++;to[edge]=u,w[edge]=c,next[edge]=head[v],head[v]=edge++; }void bfs(int s) {memset(vis,0,sizeof(vis));memset(dis,0,sizeof(dis));vis[s]=1; dis[s]=0;while(!Q.empty()) Q.pop();Q.push(s);while(!Q.empty()){int u=Q.front();Q.pop();used[u]=1;for(int i=head[u]; ~i; i=next[i]){int v=to[i];if(!vis[v]){vis[v]=1;dis[v]=dis[u]+w[i];Q.push(v);}}} }int treediameter(int s) {int u,maxl;bfs(s);maxl=0,u=s;for(int i=1; i<=n; i++)if(dis[i]>maxl)u=i,maxl=dis[i];bfs(u);maxl=0;for(int i=1; i<=n; i++)if(dis[i]>maxl)maxl=dis[i];return maxl; }int main() {int u,v,d,i;while(~scanf("%d%d",&n,&m)){init();bool f=0;while(m--){scanf("%d%d%d",&u,&v,&d);if(find(u)==find(v)) f=1;Union(u,v);add(u,v,d);}if(f) puts("YES");else{res=-1;for(i=1;i<=n;i++)if(!used[i]) res=max(res,treediameter(i));printf("%d\n",res);}}return 0; }


?

總結(jié)

以上是生活随笔為你收集整理的HDU4514(非连通图的环判断与图中最长链)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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