写点什么

7-32 哥尼斯堡的“七桥问题” (25 分)(思路

  • 2022 年 5 月 08 日
  • 本文字数:1466 字

    阅读完需:约 5 分钟

思路:


判断欧拉回路:


有向图:所有的顶点出度=入度(临接表)。


无向图:所有顶点都是偶数度(临接表)。


还有一个前提是 图得是连通的


*/


#include<bits/stdc++.h>


using namespace std;


typedef struct GNode * PtrGraph;


typedef struct GNode 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 {


int Nv;


int Ne;


int Date[1000][1000];


}gnode;


int visited[1000] = {0};


vector<int>v;


void createGraph(PtrGraph G){


int N,M;


cin >> N >> M;


G->Nv = N;


G->Ne = M;


//邻接矩阵初始化


for( int i = 1; i <= G->Nv; i++ ){


for( int j = 1; j <= G->Nv; j++ ){


G->Date[i][j] = 0;


}


}


//往邻接矩阵当中进行赋值 如果这两个点相连就赋值 1


for(int i = 0; i < G->Ne; i++ ){


int a,b;


cin >> a >> b;


G->Date[a][b] = 1;


G->Date[b][a] = 1;//因为是无向图嘛 所以得再来一个


}


}


//来验证建立的邻接矩阵是否正确


void printGraph(PtrGraph G){


for( int i = 1; i <= G->Nv; i++){


for( int j = 1; j <= G->Nv; j++)


cout << G->Date[i][j] << ' ';


cout << endl;


}


}


//引入 DFS 遍历 主要是用与判断遍历顺序的个数是否等于结点数 如果不等于就是不连通


void DFS_Graph(PtrGraph G,int a){


int temp = a;


v.push_back(temp);


visited[a] = 1;


for( int i = 1; i <= G->Nv; i++ ){


if( visited[i] != 1 && G->Date[a][i] == 1){


DFS_Graph(G,i);


}


}


}


//处理度数问题(即该结点有多少分支 就有多少度)


int judgenment(PtrGraph G){


for( int i = 1; i <= G->Nv; i++ ){


int count = 0; //用于统计某个结点的度数


for(int j = 1; j <= G->Nv; j++ ){


if(G->Date[i][j] == 1)


count++;


}


if( count % 2 != 0){


return 1;


}


}


return 0;


}


int main(){


PtrGraph G = (PtrGraph)malloc(sizeof(struct GNode));


createGraph(G);


// printGraph(G);


DFS_Graph(G,1);


//cout << v.size();


int flag1 = judgenment(G);


int flag2 = v.size();


if( flag1 == 0 && flag2 == G->Nv ){


cout << "1";


}else{


cout << "0";


}


}


[](()四:上嘛(第二种做法 就是用到并查集来处理 判断图的连通问题)


==============================================================================================


#include<bits/stdc++.h>


using namespace std;


typedef struct GNode * PtrGraph;


typedef struct GNode{


int Nv;


int Ne;


int Date[1001][1001];


}gnode;


int N,M;


int Father[1001];


void init(){


for( int i = 1; i <= N; i++ )


Father[i] = i;


}


int find( int a ){


int r=a;


while(Father[r]!=r)


r=Father[r]; //找到他的前导结点


int i=a,j;


while(i!=r){ //路径压缩算法


j=Father[i]; //记录 x 的前导结点


Father[i]=r; //将 i 的前导结点设置为 r 根节点


i=j;


}


return r;


}


//合并


void merg( int x,int y){


int a = find(x);//查询 x 的根节点


int b = find(y);//查询 y 的根节点


if(a != b )


Father[b] = a;//如果根节点不一样的话 将索引值 b 的根节点设为 a


}


//创建图


void createGraph(PtrGraph G){


cin >> N >> M;


G->Nv = N;


G->Ne = M;


init();


//邻接矩阵初始化


for( int i = 1; i <= G->Nv; i++ ){


for( int j = 1; j <= G->Nv; j++ ){


G->Date[i][j] = 0;


}


}


//往邻接矩阵当中进行赋值 如果这两个点相连就赋值 1


for(int i = 0; i < G->Ne; i++ ){


int a,b;


cin >> a >> b;


merg(a,b);


G->Date[a][b] = 1;


G->Date[b][a] = 1;//因为是无向图嘛 所以得再来一个


}


}


//处理度数问题(即该结点有多少分支 就有多少度)


int judgenment(PtrGraph G){


for( int i = 1; i <= G->Nv; i++ ){


int count = 0; //用于统计某个结点的度数

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
7-32 哥尼斯堡的“七桥问题” (25 分)(思路_Java_爱好编程进阶_InfoQ写作社区