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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

无向图的直径以及树的直径

發布時間:2024/9/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无向图的直径以及树的直径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載:http://www.csie.ntnu.edu.tw/~u91029/Path3.html

在一張無向圖上面,給定圖上一點,以最短路徑長度當作距離,找出離此點最遠的一點,這兩點之間的距離就叫做「偏心距」。


要計算一張無向圖的直徑與半徑是很簡單的,首先算好所有兩點之間最短路徑,然後按照定義來算就可以了。


先用floyd算法,再找最長的即可


  • int?d[10][10];??//?adjacency?matrix
  • int?ecc[10];????//?各點的偏心距
  • ?
  • void?diameter_radius()
  • {
  • ????//?Floyd-Warshall?Algorithm
  • ????for?(int?k=0;?k<10;?++k)
  • ????????for?(int?i=0;?i<10;?++i)
  • ????????????for?(int?j=0;?j<10;?++j)
  • ????????????????d[i][j]?=?min(d[i][j],?d[i][k]?+?d[k][j]);
  • ?
  • ????//?計算偏心距
  • ????memset(ecc,?0x7f,?sizeof(ecc));
  • ????for?(int?i=0;?i<10;?++i)
  • ????????for?(int?j=0;?j<10;?++j)
  • ????????????ecc[i]?=?min(ecc[i],?d[i][j]);
  • ?
  • ????//?計算直徑和半徑
  • ????int?diameter?=?0;
  • ????int?radius?=?1e9;
  • ????for?(int?i=0;?i<10;?++i)
  • ????{
  • ????????diameter?=?max(diameter,?ecc[i]);
  • ????????radius???=?min(radius??,?ecc[i]);
  • ????}
  • ?
  • /*
  • ????//?直徑也可以這樣算
  • ????for?(int?i=0;?i<10;?++i)
  • ????????for?(int?j=0;?j<10;?++j)
  • ????????????diameter?=?max(diameter,?d[i][j]);
  • */
  • }


  • 樹形圖的最長路徑(邊無權重)

    方法1:

    一棵無根樹的「直徑」,就是相離最遠的兩個點的距離。

    稍微修改一下計算高度的程式碼,就可以順便計算直徑。

    樹的直徑,邊無權重(adjacency matrix)
  • bool?adj[9][9];
  • int?diameter?=?0;
  • ?
  • int?DFS(int?x,?int?px)??//?px是x的父親
  • {
  • ????int?h1?=?0,?h2?=?0;?//?紀錄最高與次高的高度
  • ????for?(int?y=0;?y<9;?++y)
  • ????????if?(adj[x][y]?&&?y?!=?px)//記錄父親節點,防止重復訪問
  • ????????{
  • ????????????int?h?=?DFS(y,?x)?+?1;
  • ????????????if?(h?>?h1)?h2?=?h1,?h1?=?h;
  • ????????????else?if?(h?>?h2)?h2?=?h;
  • ????????}
  • ????diameter?=?max(diameter,?h1?+?h2);
  • ????return?h1;
  • }
  • ?
  • void?tree_diameter()
  • {
  • ????diameter?=?0;???//?初始化
  • ?
  • ????int?root?=?0;???//?隨便選一個樹根
  • ????DFS(root,?root);
  • ????cout?<<?"樹的直徑是"?<<?diameter;
  • }
  • 一棵樹的各種直徑一定會相交在同一點(同一群點)。

    1. 反證法。 現在有兩條分開的直徑, 可是一棵樹上各點都得連通, 所以這兩條分開的直徑,中間一定有某處互相連接, 一旦連接起來,勢必變成更長的直徑,矛盾。 故所有直徑必相交。2. 反證法。 現在已有兩條直徑相交在某一點, 如果另外一條直徑與這兩條直徑相交在另一點, 勢必變成更長的直徑,矛盾。 故所有直徑必相交在同一點(同一群點)。

    方法二:

    在一個迷宮中找距離最長的兩個點。迷宮可以看作是一個無根樹,因此,這個問題等價與在一個樹形圖中找最遠的兩個節點,也叫做這個圖的直徑。

    迷宮、樹形圖有個很好的特點:任意兩個節點之間的距離就是這兩點之間的最短路徑、也是兩個節點的最長路徑,也可以說任意兩個節點之間的距離一定。基于這個想法,可以很快想到:窮舉每個點對,計算其距離,取最大值,即可。這個計算量比較大,思想上可行,實踐起來,時間代價有點不靠譜。查了下,已經有好的解決方案了:

    1 取任意節點作為起點,找出到該點最遠的點,記為A;

    2 以點A為起點,找出到該點最遠的點,記為B;

    AB之間的距離,就是圖中距離最遠的兩個點的距離(這樣的點對可能有多個,但最大距離值只有一個)。

    因此,兩次dfs即可搞定。也可以用bfs

    代碼如下:

    #include<stdio.h>

    #include<stdlib.h>

    #include<string.h>

    ?

    int m,n;

    int f[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};

    char map[1002][1002];

    bool flag[1002][1002];

    ?

    int max,step,maxM,maxN;

    int si,sj;

    ?

    void dfs(int i,int j)

    {

    ? ? int ii,a,b;

    ? ? for(ii=0;ii<4;ii++)

    ? ? {

    ? ? ? ? a = i+ f[ii][0];

    ? ? ? ? b = j+ f[ii][1];

    ? ? ? ? if(a>=0 && a<m && b>=0 && b<n && map[a][b]=='.' && flag[a][b])

    ? ? ? ? {

    ? ? ? ? ? ? step++;

    ? ? ? ? ? ? flag[a][b] = false;

    ? ? ? ? ? ? if(max < step)

    ? ? ? ? ? ? {

    ? ? ? ? ? ? ? ? max = step;

    ? ? ? ? ? ? ? ? maxM = a;

    ? ? ? ? ? ? ? ? maxN = b;

    ? ? ? ? ? ? }

    ? ? ? ? ? ? dfs(a,b);

    ? ? ? ? ? ? flag[a][b] = true;

    ? ? ? ? ? ? step--;

    ? ? ? ? }

    ? ? }

    }

    int main()

    {

    ? ? int t,i,j;

    ? ? scanf("%d",&t);

    ? ? while(t--)

    ? ? {

    ? ? ? ? scanf("%d%d",&n,&m);

    ? ? ? ? si = -1;

    ? ? ? ? for(i=0;i<m;i++)

    ? ? ? ? {

    ? ? ? ? ? ? scanf("%s",map[i]);

    ? ? ? ? ? ? if(si==-1)

    ? ? ? ? ? ? ? ? for(j=0;j<n;j++)

    ? ? ? ? ? ? ? ? ? ? if(map[i][j]=='.')

    ? ? ? ? ? ? ? ? ? ? {

    ? ? ? ? ? ? ? ? ? ? ? ? si = i;

    ? ? ? ? ? ? ? ? ? ? ? ? sj = j;

    ? ? ? ? ? ? ? ? ? ? ? ? break;;

    ? ? ? ? ? ? ? ? ? ? }

    ? ? ? ? }

    ? ? ? ??

    ? ? ? ? memset(flag, true, sizeof(flag));

    ? ? ? ? flag[si][sj] = false;

    ? ? ? ? max = 0;

    ? ? ? ? step = 0;

    ? ? ? ? dfs(si,sj);

    ? ? ? ??

    ? ? ? ? memset(flag, true, sizeof(flag));

    ? ? ? ? flag[maxM][maxN] = false;

    ? ? ? ? max = 0;

    ? ? ? ? step = 0;

    ? ? ? ? dfs(maxM, maxN);

    ? ? ? ??

    ? ? ? ? printf("Maximum rope length is %d.\n",max);

    ? ? }

    ? ? system("pause");

    ? ? return 0;

    }


    如果邊有權重的話,感覺著兩個算法也能正常工作


    總結

    以上是生活随笔為你收集整理的无向图的直径以及树的直径的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 黄色大片儿. | 亲子乱一区二区三区 | 国产高清在线视频观看 | 色天天色| 成年人黄色片网站 | 午夜福利电影 | 国产午夜三级一区二区三 | 精品一区二区三区免费 | 毛片福利视频 | 国产欧美一区二区三区国产幕精品 | 国产精品一区二区三区四 | 亚洲宅男天堂 | 日韩成人精品一区二区 | 国产a级精品 | 欧美成人第一页 | 国产精品v欧美精品v日韩 | 岛国av一区二区三区 | 亚洲国产日韩欧美一区二区三区 | 国产suv精品一区二区33 | 欧美少妇bbw | 青娱乐自拍视频 | 高清av一区二区三区 | 9l蝌蚪porny中文自拍 | 午夜精品欧美 | 日韩欧美在线观看 | 无码人妻丰满熟妇精品 | 真人一毛片 | 国产精选在线观看 | 亚洲卡一卡二 | 欧美韩国日本在线 | 欧美色图888 | 成人拍拍视频 | 欧美精品videos另类 | 黄色大片中文字幕 | 少妇精品高潮欲妇又嫩中文字幕 | 国产中文在线播放 | 亚洲av无码乱码国产精品久久 | 99re最新| 色吧在线观看 | 欧美顶级少妇做爰 | 日本极品少妇 | 最近中文字幕无免费 | 天堂在线观看中文字幕 | 国产一区二区三区视频免费观看 | 91久久久国产精品 | 逼特逼在线视频 | 国产精品老熟女一区二区 | 免费av小说 | 欧美日韩一区电影 | 午夜精产品一区二区在线观看的 | 美女扒开尿口让男人桶 | 99视屏| 色999日韩 | 国产亚洲美女精品久久久2020 | 国产人人干 | 亚洲妇女无套内射精 | 亚洲成人av一区二区三区 | 欧美性日韩 | 日韩极品视频在线观看 | av中文字幕观看 | 日韩欧美高清一区 | 久久久久久久久久久久久久国产 | 北京富婆泄欲对白 | 青青草久| 免费成人在线观看 | 法国空姐 在线 | 综合激情亚洲 | 五月激情在线观看 | 国产成人短视频 | 麻豆视频黄色 | 一曲二曲三曲在线观看中文字幕动漫 | 91精品国产91久久久久福利 | 大尺度网站在线观看 | www日本高清视频 | 国产自偷自拍 | 高跟鞋和丝袜猛烈xxxxxx | 偷自拍| 久久99草 | 黄色片在哪里看 | 青青草伊人久久 | 精品久久久久久中文字幕 | 亚洲视频在线播放 | 极品在线观看 | 夜夜操夜夜干 | 美女啪啪免费视频 | 少妇真人直播免费视频 | 在线你懂得 | 欧美日韩系列 | 无码精品人妻一区二区三区漫画 | 久久福利精品 | www.超碰在线 | 日本视频二区 | 国产成人激情 | 黄色片女人 | 18无码粉嫩小泬无套在线观看 | 美女爱爱爱 | 青青草成人免费在线视频 | 亚洲小说网| 天天插夜夜 |