下面介绍几个用于判断给定的图G=(V
标签:
下面介绍几个用于判断给定的图G=(V
中是否欧拉通路或欧拉回路:
这样,我们就可以很容易想出程序的思路:
代码如下:
#include <iostream> #include <cstring> #include <vector> using namespace std; const int MAX = 10240; int N, M, pCnt[MAX]; int pMap[MAX][MAX]; vector<int> pVec; void Search(int x); void Euler_Circuit(); int main() { cin >> N >> M; memset(pMap, 0, sizeof(pMap)); for(int i = 1; i <= M; i++) { int s, e; cin >> s >> e; pMap[s][e] = pMap[e][s] = 1; // 无向图 } Euler_Circuit(); return 0; } void Euler_Circuit() { int nStart = 1, nOddNum = 0; // nStart保存起点,nOddNum保存有几个顶点有奇数度 memset(pCnt, 0, sizeof(pCnt)); for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { pCnt[i] += pMap[i][j]; // 计算各个顶点的度 } } for(int i = 1; i <= N; i++) // 统计奇数度顶点的个数 { if(pCnt[i] & 1) { nStart = i; nOddNum++; } } if(nOddNum > 2 || nOddNum == 1) // 不存在欧拉回路 { cout << "Not Exsit Euler Circuit" << endl; } else { Search(nStart); for(int i = 0; i < pVec.size(); i++) { cout << pVec[i] << " "; } cout << endl; } } void Search(int x) { for(int i = 1; i <= N; i++) { if(pMap[x][i] == 1) { pMap[x][i] = pMap[i][x] = 0; // 删边 Search(i); } } pVec.push_back(x); }
标签:
原文地址:http://www.cnblogs.com/mahaitao/p/5796391.html