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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

6-2 两顶点之前有路径吗?

發布時間:2023/12/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6-2 两顶点之前有路径吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

6-2 兩頂點之前有路徑嗎? (20 分)

對于給定的無向圖及兩個圖中的頂點,請實現一個函數,分別打印包含這兩個頂點的連通分量中的頂點數,并判斷這兩個頂點之間是否有路徑。

函數接口定義:
int hasPath(struct Graph *g, int v, int w);
其中v和w是頂點
圖定義如下:

#define MaxVertexNum 20 /* 最大頂點數 */ struct Graph{int v; /* 頂點數量 */int Adj[MaxVertexNum][MaxVertexNum]; /* 鄰接矩陣 */ };

題目保證圖至少有一個頂點
函數分別在第一行和第二行打印包含v和w的連通分量中頂點的數量。
如果 v和w之間有路徑,函數返回1, 否則返回0.
提示:

你可以定義多個函數,也可以定義全局變量.
當v和w是同一個頂點時,認為v和w之間是有路徑的。
裁判測試程序樣例:

#include <stdio.h> #include <stdlib.h> #define MaxVertexNum 20 /* 最大頂點數設為20 */ struct Graph{int v; // amount of verticesint Adj[MaxVertexNum][MaxVertexNum]; /* 鄰接矩陣 */ }; int visited[MaxVertexNum]; /* 頂點的訪問標記 */ struct Graph* CreateGraph(){int v;scanf("%d",&v);struct Graph* g;g = malloc(sizeof(struct Graph));if(!g) return NULL;g->v = v;for(int i=0; i<v; i++){visited[i] = 0;for(int j=0; j<v; j++)scanf("%d",&(g->Adj[i][j]));}return g; } int hasPath(struct Graph *g, int v, int w); int main(){struct Graph* g;g = CreateGraph();int v,w;scanf("%d%d", &v, &w);printf("%s\n", hasPath(g,v,w) ? "Yes" : "No");return 0; } /* 你的代碼將被嵌在這里 */

輸入樣例:

對于此圖及樣例測試程序規定的輸入格式:

8
0 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0
1 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 3
結尾無空行
Sample Output:
5
2
No
結尾無空行

C(gcc)

int F = 0; int hasPath(struct Graph* g, int v, int w) {int q[1000];int l = 0, r = 0, t;visited[v] = 1;q[r++] = v;while (l < r){t = q[l++]; if (t == w) { F = 1; break; }for (int i = 0; i < g->v; i++){if (g->Adj[t][i] && visited[i] == 0){q[r++] = i; visited[i] = 1;}}}travel(g, v);travel(g, w);return F; } void travel(struct Graph* g, int v)// BFS統計連通分量頂點個數 {for (int i = 0; i < g->v; i++)visited[i] = 0;//清空搜索記錄int q[1000];int l = 0, r = 0, c = 0, t;visited[v] = 1;q[r++] = v;while (l < r){t = q[l++]; c++;for (int i = 0; i < g->v; i++){if (g->Adj[t][i] && visited[i] == 0){q[r++] = i; visited[i] = 1;}}}printf("%d\n", c); }

總結

以上是生活随笔為你收集整理的6-2 两顶点之前有路径吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

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