日韩性视频-久久久蜜桃-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;

    }


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


    總結

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

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

    主站蜘蛛池模板: 超碰在线观看免费 | 天天做天天摸天天爽天天爱 | 成人在线免费网站 | 午夜精品极品粉嫩国产尤物 | 天天干天天插天天操 | 老司机在线观看视频 | 国产口爆吞精一区二区 | 色妞综合网 | 一区二区三区四区在线 | 中文字幕第7页 | 日韩女优在线观看 | 自拍天堂 | 天天性综合 | 上原亚衣在线 | 国产在线观看免费高清 | 日韩国产成人在线 | 天天插天天爽 | 欧美xxxx8888| 夜夜操网 | 天天干免费视频 | 玉女心经是什么意思 | 国产日韩精品视频 | 人妖videosex高潮另类 | 国产精品男人的天堂 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 日本色中色 | 久久精品网址 | 西西人体44www大胆无码 | 黑人激情视频 | 黄色电影在线视频 | 国产aⅴ一区二区三区 | 亚洲无色 | 天天插天天操天天干 | 四虎精品 | 国产性猛交xx乱 | wwww在线观看 | 荷兰av| 欧美激情一区二区三区蜜桃视频 | 亚洲少妇一区 | 九九九九九精品 | 91麻豆成人精品国产 | 日韩高清影视在线观看 | 中字幕一区二区三区乱码 | 老妇裸体性激交老太视频 | 欧美黄色录像片 | 丁香花免费高清完整在线播放 | 久久久久久伦理 | 久久国语对白 | 国产人成在线 | 激情在线网站 | 五月婷婷伊人网 | 日本一二三不卡 | 大陆极品少妇内射aaaaaa | wwwxxx色| 青青草原综合久久大伊人精品 | 色呦呦中文字幕 | 动漫av在线免费观看 | 波多野结衣在线影院 | 国产尤物精品 | 中文字幕在线日亚洲9 | 小镇姑娘1979版 | 性高湖久久久久久久久aaaaa | 91av官网| 淫妹妹影院 | 中年夫妇啪啪高潮 | 91免费观看网站 | 亚洲精品国产精品乱码视色 | 日韩大片免费在线观看 | 污视频在线免费观看 | 国产精品高潮AV无码 | 男人天堂手机在线观看 | 国产一级二级三级在线 | 久久久久久夜 | 色77777| 少妇免费毛片久久久久久久久 | 好吊色青青草 | 日韩三级不卡 | 国语播放老妇呻吟对白 | 综合久久久久久 | 男性裸体全身精光gay | 黄色片在线观看免费 | 亚洲精品一区 | 精品中文字幕一区 | 日韩欧美久久精品 | 欧美人与野| 日韩资源| 亚洲欧美日本一区二区 | 91在线视频国产 | 欧美乱妇15p| 五月婷婷av | 青草伊人网 | 天堂v在线观看 | 99久久精品国产成人一区二区 | 亚洲色图美腿丝袜 | 亚洲不卡网 | 伊人久久大香网 | 2019年中文字幕 | 丰满少妇一区二区三区专区 | 成人午夜免费在线 |