欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
圖的幾種存儲方式

圖的幾種存儲結構:

1、鄰接矩陣

2、鄰接表

3、鏈式前向星

4、C++中vector的鄰接表實(shí)現(補充)

(一)鄰接矩陣

鄰接矩陣是表示頂點(diǎn)之間相鄰關(guān)系的矩陣。

鄰接矩陣的好處:

(1)直觀(guān)、簡(jiǎn)單、好理解

(2)方便檢查任意一對定點(diǎn)間是否存在邊

(3)方便找任一頂點(diǎn)的所有“鄰接點(diǎn)”(有邊直接相連的頂點(diǎn))

(4)方便計算任一頂點(diǎn)的度

對于無(wú)向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個(gè)數正好是第i個(gè)頂點(diǎn)的度。

對于有向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個(gè)數正好是第i個(gè)頂點(diǎn)的出度(或入度)。

鄰接矩陣的局限性:時(shí)間復雜度O(n^2),空間復雜度O(n^2)

(1)浪費空間。對于稠密圖還是很合算的。

                          但是對于稀疏圖(點(diǎn)很多而邊很少)有大量無(wú)效元素。

(2)浪費時(shí)間。要確定圖中有多少條邊,則必須按行、按列對每個(gè)元素進(jìn)行檢測,所花費的時(shí)間代價(jià)很大。

bb這么多,我們直接來(lái)以OJ此專(zhuān)題第一題為例

這題二維數組map不能用int,會(huì )爆內存,bool可以自己百度,簡(jiǎn)而言之就是用于邏輯判斷,只有true和false兩種情況。

bool類(lèi)型在存儲二值變量,或者說(shuō)只有真假時(shí),更具優(yōu)勢,因為只有0和1即false和true,省空間

(int型的0和1都是4字節,bool都是1字節)

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdbool.h>
  4. bool map[5001][5001];
  5. int main()
  6. {
  7. int n,m;
  8. int u,v;
  9. int q;
  10. while(~scanf("%d %d",&n,&m))
  11. {
  12. memset(map,false,sizeof(map));
  13. while(m--)
  14. {
  15. scanf("%d %d",&u,&v);
  16. map[u][v]=true;
  17. }
  18. scanf("%d",&q);
  19. while(q--)
  20. {
  21. scanf("%d %d",&u,&v);
  22. if(map[u][v])
  23. {
  24. printf("Yes\n");
  25. }else
  26. {
  27. printf("No\n");
  28. }
  29. }
  30. }
  31. return 0;
  32. }

(二)鄰接表

圖的鄰接表存儲方法是一種順序分配與鏈式分配相結合的存儲方法。

在鄰接表中,對圖中每個(gè)頂點(diǎn)建立一個(gè)單鏈表,第i個(gè)單鏈表中的節點(diǎn)表示依附于頂點(diǎn)i的邊(對有向圖是以頂點(diǎn)i為尾的邊)。每個(gè)單鏈表上附設一個(gè)表頭節點(diǎn)。

鄰接表的特點(diǎn)如下:

(1)鄰接表表示不唯一。這是因為在每個(gè)頂點(diǎn)對應的單鏈表中,各邊節點(diǎn)的鏈接次序可以是任意的,取決于建立鄰接表的算法以及邊的輸入次序。

(2)對于有n個(gè)頂點(diǎn)和e條邊的無(wú)向圖,其鄰接表有n個(gè)頂點(diǎn)節點(diǎn)和2e個(gè)邊節點(diǎn)。顯然,在總的邊數小于n(n-1)/2的情況下,鄰接表比鄰接矩陣要節省空間。

(3)對于無(wú)向圖,鄰接表的頂點(diǎn)i對應的第i個(gè)鏈表的邊節點(diǎn)數目正好是頂點(diǎn)i的度。

(4)對于有向圖,鄰接表的頂點(diǎn)i對應的第i個(gè)鏈表的邊節點(diǎn)數目?jì)H僅是頂點(diǎn)i的出度。其入度為鄰接表中所有adjvex域值為i的邊節點(diǎn)數目。
 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct node
  5. {
  6. int data;
  7. struct node *next;
  8. };
  9. int main()
  10. {
  11. int n, u, j, i, v;
  12. struct node *p, *a[5050];
  13. while(~scanf("%d", &n))
  14. {
  15. for(i = 0; i < n; i++)
  16. a[i] = NULL;
  17. for(i = 0; i < n; i++)
  18. {
  19. for(j = 0; j < n; j++)
  20. {
  21. scanf("%d", &u); //審清題意
  22. if(u == 1)
  23. {
  24. if(a[i] == NULL)
  25. {
  26. p = (struct node *)malloc(sizeof(struct node));
  27. p -> data = j;
  28. p -> next = NULL;
  29. a[i] = p;
  30. }
  31. else
  32. {
  33. p = (struct node *)malloc(sizeof(struct node));
  34. p -> next = a[i] -> next;
  35. p -> data = j;
  36. a[i] -> next = p;
  37. }
  38. }
  39. }
  40. }
  41. int q;
  42. scanf("%d", &q);
  43. while(q--)
  44. {
  45. scanf("%d%d", &u, &v);
  46. p = a[u];
  47. int flag = 0;
  48. while(p)
  49. {
  50. if(p -> data == v)
  51. {
  52. flag = 1;
  53. break;
  54. }
  55. p = p -> next;
  56. }
  57. if(flag)
  58. printf("Yes\n");
  59. else
  60. printf("No\n");
  61. }
  62. }
  63. return 0;
  64. }

(三)鏈式前向星

 https://blog.csdn.net/Binary_Heap/article/details/78209086

1. 結構

這里用兩個(gè)東西:

1 結構體數組edge存邊,edge[i]表示第i條邊,

2 head[i]存以i為起點(diǎn)的第一條邊(在edge中的下標)

  1. struct edge{
  2. int to; //這條邊的終點(diǎn)
  3. int w; //權值
  4. int next; //下一條邊的存儲下標(默認0)
  5. }e[500010];

 

2.增邊

若以點(diǎn)u為起點(diǎn)的邊新增了一條,在edge中的下標為cnt.

那么edge[++cnt].next=head[u];然后head[u]=cnt.

即每次新加的邊作為第一條邊,最后倒序遍歷

  1. void add(int u, int v, int w)
  2. {
  3. e[cnt].to = v;
  4. e[cnt].w = w;
  5. e[cnt].next = head[u];//cnt為邊的計數,從1開(kāi)始計
  6. head[u] = cnt++; //第一條邊為當前邊
  7. }

 

3. 遍歷

遍歷以st為起點(diǎn)的邊

for(int i=head[st]; i!=0; i=edge[i].next)

 i 開(kāi)始為第一條邊,每次指向下一條(以0為結束標志)  (若下標從0開(kāi)始,next應初始化-1)

鏈式前向星主要是用來(lái)優(yōu)化的,可以用來(lái)優(yōu)化BFS,SPFA算法等等。在做最短路的時(shí)候一直T就是因為沒(méi)有用鏈式前向星存邊導致的超時(shí),所以這個(gè)坑我先和你們說(shuō)下。

(四)vector的鄰接表(補充)

vector是C++STL里面的一個(gè)東西,簡(jiǎn)單的來(lái)說(shuō)就是一個(gè)可變長(cháng)的數組,你可以通過(guò)往它里面壓入數據來(lái)使它變長(cháng),

想深入了解的可以自己百度一波,還是以這道題為例:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>//注意這個(gè)頭文件不能丟,要么你就去用萬(wàn)能頭
  4. using namespace std;
  5. #define N 500001
  6. vector<int>MAP[N];//可以理解為二維的,每個(gè)MAP可以包含若干項,這些項是以當前編號點(diǎn)為起點(diǎn)
  7. int main()
  8. {
  9. int n,m,u,v,i;
  10. while(~scanf("%d %d",&n,&m))
  11. {
  12. while(m--)
  13. {
  14. scanf("%d %d",&u,&v);
  15. MAP[u].push_back(v);//擴充
  16. }
  17. int q;
  18. scanf("%d",&q);
  19. while(q--)
  20. {
  21. scanf("%d %d",&u,&v);
  22. int len=MAP[u].size();
  23. int flag=0;
  24. for(i=0;i<len;i++)
  25. {
  26. if(MAP[u][i]==v)
  27. {
  28. flag=1;
  29. }
  30. }
  31. if(flag)
  32. {
  33. cout<<"Yes"<<endl;
  34. }else
  35. {
  36. cout<<"No"<<endl;
  37. }
  38. }
  39. for(int i=0; i<N; i++)
  40. {
  41. MAP[i].clear();
  42. }
  43. }
  44. return 0;
  45. }

嗯,目前我用過(guò)的圖的幾種存儲方式就這樣啦,謝謝大家觀(guān)賞拙作。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
數據結構——圖(1)PTA習題
圖的廣度優(yōu)先搜索(鄰接表)
圖的定義、廣度搜索、深度搜索
c語(yǔ)言數據結構--圖的鄰接矩陣和鄰接表操作的基本操作
2020.11.14-pta天梯練習賽補題
數據結構_鄰接表以及鄰接矩陣的運用_課程設計_實(shí)驗報告
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久