1. 程式人生 > >C++ 判斷圖兩頂點間是否有路徑

C++ 判斷圖兩頂點間是否有路徑

#include <bits/stdc++.h>
#define MaxSize 100

/*
* Created by HarvestWu on 2018/07/18.
*/
using namespace std;
typedef int ElemType;

//邊表
typedef struct ArcNode
{
	int adjvex;                 //該邊所指向的結點的位置
	struct ArcNode *nextarc;    //指向下一條邊的指標
	int info;                   //
}ArcNode;

//頂點表
typedef struct
{
	char data;                  //頂點資訊
	ArcNode *firstarc;          //指向第一條邊的指標
}VNode;

//鄰接表
typedef struct
{
	VNode adjlist[MaxSize];
	int n, e;                    //頂點數、邊數
}AGraph;                        //圖的鄰接表型別

//圖的深度優先搜尋遍歷(DFS)
//假設用鄰接表作為圖的儲存結構

int visit[MaxSize];
void DFS(AGraph *G, int v)
{
	ArcNode *p;
	visit[v] = 1;					//置標誌位1代表已訪問
	p = G->adjlist[v].firstarc;		//p指向頂點v的第一條邊
	while (p != NULL)
	{
		if (visit[p->adjvex] == 0)	//未訪問則遞迴訪問
			DFS(G, p->adjvex);
		p = p->nextarc;
	}

}

//圖的廣度優先搜尋遍歷(BFS)
//假設用鄰接表作為圖的儲存結構

void BFS(AGraph *G, int v, int visit[MaxSize])
{
	ArcNode *p;
	int que[MaxSize], front = 0, rear = 0;
	int j;
	visit[v] = 1;				//置標誌位1代表已訪問
	rear = (rear + 1) % MaxSize;
	que[rear] = v;				//當前頂點入隊,便於此層掃描完後,繼續下一層
	while (front != rear)		//隊空則遍歷結束
	{
		front = (front + 1) % MaxSize;
		j = que[front];
		p = G->adjlist[j].firstarc;
		while (p != NULL)
		{
			if (visit[p->adjvex] == 0)
			{
				visit[p->adjvex] = 1;
				rear = (rear + 1) % MaxSize;
				que[rear] = p->adjvex;
			}
			p = p->nextarc;
		}
	}
}

//建立無向圖的鄰接表
void createAGraph2(AGraph *&AG)
{
	int i, j, k;
	ArcNode *q;
	cout << "輸入頂點數、邊數:" << endl;
	cin >> AG->n >> AG->e;
	for (i = 0; i<AG->n; i++)
	{
		AG->adjlist[i].data = i;
		AG->adjlist[i].firstarc = NULL;
	}
	cout << "輸入邊(vi,vj)的頂點序號i,j:" << endl;
	for (k = 0; k<AG->e; ++k)
	{
		cin >> i >> j;
		//頭插法
		q = (ArcNode*)malloc(sizeof(ArcNode));
		q->adjvex = j;
		q->nextarc = AG->adjlist[i].firstarc;
		AG->adjlist[i].firstarc = q;

		q = (ArcNode*)malloc(sizeof(ArcNode));
		q->adjvex = i;
		q->nextarc = AG->adjlist[j].firstarc;
		AG->adjlist[j].firstarc = q;

	}
}

//判斷圖兩頂點間是否有路徑
int trave(AGraph *G,int a,int b)
{
    for(int i=0;i<G->n;++i)
        visit[i]=0;
    //DFS(G,a);//兩種遍歷方式均可
    BFS(G,a,visit);
    if(visit[b]==1)
        return 1;
    else return 0;
}
AGraph *AG;
int main()
{
	AG = (AGraph*)malloc(sizeof(AGraph));
	createAGraph2(AG);
	int a,b;
	cout<<"請輸入頂點a,b:"<<endl;
	while(cin>>a>>b)
        cout<<trave(AG,a,b)<<endl;

	return 0;
}

相關推薦

C++ 判斷頂點是否路徑

#include <bits/stdc++.h> #define MaxSize 100 /* * Created by HarvestWu on 2018/07/18. */ using namespace std; typedef int ElemType;

C++求任意兩點的所有路徑

基於連通圖,鄰接矩陣實現的圖,非遞迴實現。 演算法思想: 設定兩個標誌位,①該頂點是否入棧,②與該頂點相鄰的頂點是否已經訪問。   A 將始點標誌位①置1,將其入棧   B 檢視棧頂節點V在圖中,有沒有可以到達、且沒有入棧、且沒有從這個節點V出發訪問過的節點   C 如果有

無向中求頂點的所有路徑演算法

int invexset(AdjMultiList g,int vi,EdgeNode *pe,int pk){ VertexData v; int vj; if(pe->ivex==vi) vj=pe->jvex;  else vj=pe->ivex; v=g.vertex[vj].dat

C#判斷字符串中是否數字

private 收藏 summary 數字字符串 name ber color param class 1 // <summary> 2 /// 提取字符串中的數字字符串 3 /// </summary>

演算法---每對頂點最短路徑

3.2、額外空間儲存2*(n*n)def floyd_warshall(W): import copy #需要兩個n*n矩陣的額外儲存 D_in = copy.deepcopy(W) D_ret = copy.deepcopy(W) k = 0 while k

演算法 - 只需“五步” ,獲取節點的所有路徑(非遞迴方式)

在實現 “圖” 資料結構時,會遇到 “獲取兩點之間是所有路徑” 這個演算法問題,網上的資料大多都是利用遞迴演算法來實現(見文末的參考文章)。 我們知道在 JS 中用遞迴演算法很容易會讓呼叫棧溢位,為了能在生產環境中使用,必須要用非遞迴方式的去實現。 經過一番

C++ 判斷檔案是否存在,分解檔案路徑

GetModuleFileName    獲取程序絕對路徑(包括檔名) PathFindFileName    獲取路徑中的檔名 PathRemoveFileSpec()    去除路徑中的檔名 1

牛客練習賽27-----C.水(DFS求最長路徑

題目描述: 小w不會離散數學,所以她van的圖論遊戲是送分的 小w有一張n個點n-1條邊的無向聯通圖,每個點編號為1~n,每條邊都有一個長度 小w現在在點x上 她想知道從點x出發經過每個點至少一次,最

Toposort Description    給出一個判斷中是否存在迴路。 Input:   第1行:輸入頂點個數N(1 ≤ N≤ 2,500)和C的邊數,1 ≤ C ≤ 6,20

Toposort Description 給出一個有向圖,判斷圖中是否存在迴路。 Input: 第1行:輸入圖的頂點個數N(1 ≤ N≤ 2,500)和C(圖的邊數,1 ≤ C ≤ 6,200); 第2到C+1行中,第i+1行輸入兩個整數,分別表示第i條邊的起點和終點的編號

利用並查集進行頂點是否連通的判斷

//利用並查集判斷無向圖中兩節點是否連通 #include <iostream> #include<cstdio> using namespace std; const int maxn=100+5; int vset[maxn]; int rank

C# 判斷個集合(List)是否相等

getc tcollect color 是否 rep 復雜度 etl blog 重復項 1.兩個list如果有重復元素(如List1: a,b,a List2: b,b,a) 是無法通過包含關系來判斷是否相等的. 有兩個辦法,其一是兩個List排序後再按順序比較.另一個辦

C++ 判斷一顆樹騰訊分是分網站開發是BST(二叉排序樹)

sizeof 存儲 tno ret turn bre 打印 二叉 添加 因為騰訊分分網站開發 haozbbs.com Q1446595067二叉排序樹的中序遍歷結果是遞增的,所以可以通過中序遍歷存儲結果,再判斷是否為遞增的數組。1) 對樹進行中序遍歷,將結果保存在b[]

c++ 判斷陣列元素是否負數(any_of)

  #include <iostream> // std::cout #include <algorithm> // std::any_of #include <array> // std::array using namesp

python 判斷個列表是否公共元素

  def common_data(list1, list2): result = False for x in list1: for y in list2: if x == y:

C語言實現 個int(32位)整數m和n的二進位制表達中,多少個位(bit)不同?

輸入例子: 1999 2299 輸出例子:7 int main() { int a = 0; int b = 0; int num = 0; int count = 0; printf("請輸入兩個整數:"); scanf("%d%d",&a,&b); n

1.1 MySQL判斷個字串是否交集

1.1.1 設定log_bin_trust_function_creators log_bin_trust_function_creators控制是否可以信任儲存函式建立者,不會建立寫入二進位制日誌引起不安全事件的儲存函式。如果設定為0(預設值),使用者不得建立或修改儲存函式,除非它

[] 7.27 找頂點之間的路徑長度為k的簡單路徑-鄰接表

題目來源:嚴蔚敏《資料結構》C語言版本習題冊 7.27 【題目】7.27 採用鄰接表儲存結構,編寫一個判別無向圖中任意給定的兩個頂點之間是否存在一條長度為k的簡單路徑的演算法(一條路徑為簡單路徑指的是其頂點序列中不含有重現的頂點)。 【測試資料】123456

C#判斷個檔案是否一樣

1、使用System.security.Cryptography.HashAlgorithm類為每個檔案生成一個雜湊碼,然後比較兩個雜湊碼是否一致。     2、 在比較檔案內容的時候可以採用好幾種方法。例如,檢查檔案的某一特定部分是否一致;如果願意,你甚至可以

C語言使用memcpy函式實現個數任意位置的複製操作

  c和c++使用的記憶體拷貝函式,memcpy函式的功能是從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中。   用法:void *memcpy(void *dest, const void *src, size_t n); 舉例:   char tes

C 判斷 —— switch語句(輸入的年份判斷是否為閏年,根據輸入的月份判斷這月多少天)

 使用 switch 語句程式設計,根據輸入的年份判斷是否為閏年,根據輸入的月份判斷這月有多少天。 #include<stdio.h> int main() { int year