
补充:#include "stdafx.h"#include <time.h> #include<iostream>#include<ctime>#include<algorithm>#include <stdlib.h>#include<string>#include <cstdio>#include <fstream>#include <cmath>#include <deque>#include <vector>#include <list>#include <queue>#include <cstring>#include <map>#define PI acos(-1.0)#define mem(a,b) memset(a,b,sizeof(a))#define sca(a) scanf("%d",&a)#define pri(a) printf("%d\n",a)#define M 202#define INF 100000001using namespace std;int v0[10000];int u0[10000];;int m = 0;int n = 0;int cout0= 0;typedef long long ll;struct stack{int top, node[M];}s;int e[M][M];int suiji[3][10000];void RAND(int max, int min, int n){srand((unsigned)time(NULL));for (int i = 1; i <= max; ++i){for (int j = 1; j <= i; ++j)if (i != j){suiji[0][cout0] = j;suiji[1][cout0] = i;cout0++;}}int c = 2;int j = 0;int c1 = 0;srand((unsigned)time(NULL));for (int i = 0; i<n; i++){suiji[2][i] = 3;}suiji[2][0] = 2;while (j<n){suiji[2][j + c] = 2;j = j + c;c1++;c++;if (c1 == max - 2){suiji[0][n - 1] = 2;}}}void dfs(int x){int i;s.node[++s.top] = x;for (i = 0; i<n; i++){if (e[i][x]>0){e[i][x] = e[x][i] = 0; //删除这条边dfs(i);break;}}}void fleury(int x){int i, flag;s.top = 0; s.node[s.top] = x;while (s.top >= 0){flag = 0;for (i = 0; i<n; i++){if (e[s.node[s.top]][i]>0){flag = 1;break;}}if (!flag) printf("%d ", s.node[s.top--] + 1);else dfs(s.node[s.top--]);}puts("");}//检验输入边数和顶点数的值是否有效,可以自己推算为啥://顶点数和边数的关系是:((Vexnum*(Vexnum - 1)) / 2) < edgebool check(int Vexnum, int edge) {if (Vexnum <= 0 || edge <= 0 || ((Vexnum*(Vexnum - 1)) / 2) < edge)return false;return true;}//顶点从1开始编号bool check_edge(int Vexnum, int start, int end, int weight) {if (start<1 || end<1 || start>Vexnum || end>Vexnum || weight < 0) {return false;}return true;}//边集结构,用于保存每条边的信息typedef struct edge_tag {bool visit; //判断这条边是否加入到了最小生成树中int start; //该边的起点int end; //该边的终点int weight; //该边的权重}Edge;//创建一个图,但是图是使用边集结构来保存void createGraph(Edge * &e, int Vexnum, int edge) {e = new Edge[edge];//为每条边集开辟空间int start = 0;int end = 0;int weight = 0;int i = 0;while (i != edge){ start = suiji[0][i];end = suiji[1][i];weight = suiji[2][i];cout << start << " " << end << " " << weight;cout <<" | ";while (!check_edge(Vexnum, start, end, weight)) {cout << "输入的值不合法,请重新输入每条边的起点、终点和权重:" << endl;start = suiji[0][i];end = suiji[1][i];weight = suiji[2][i];}e[i].start = start;e[i].end = end;e[i].weight = weight;e[i].visit = false; //每条边都还没被初始化++i;}}int cmp(const void* first, const void * second) {return ((Edge *)first)->weight - ((Edge *)second)->weight;}int find_root(int child, int * parent) {if (parent[child] == child) {return child;}parent[child] = find_root(parent[child], parent);return parent[child];}bool union_tree(Edge e, int * parent, int * child) {//先找出改边所在子树的根节点int root1;int root2;//记住我们顶点从1开始的,所以要减1root1 = find_root(e.start - 1, parent);root2 = find_root(e.end - 1, parent);//只有两个顶点不在同一颗子树上,才可以把两棵树并未一颗树if (root1 != root2) {//小树合并到大树中,看他们的孩子个数if (child[root1] > child[root2]) {parent[root2] = root1;//大树的孩子数量是小树的孩子数量加上//大树的孩子数量在加上小树根节点自己child[root1] += child[root2] + 1;}else {parent[root1] = root2;child[root2] += child[root1] + 1;}return true;}return false;}void Kruskal() {int Vexnum = 0;int edge = 0;cout << "请输入图的顶点数和边数:" << endl;cin >> Vexnum >> edge;cout << "下面为随机生成的完全图(依次为起点,终点,权值):" << endl;while (!check(Vexnum, edge)) {cout << "你输入的图的顶点数和边数不合法,请重新输入:" << endl;cin >> Vexnum >> edge;}n = Vexnum;RAND(100, 1,(n*(n-1))/2);m = Vexnum * 2 - 2;//声明一个边集数组Edge * edge_tag;//输入每条边的信息createGraph(edge_tag, Vexnum, edge);int * parent = new int[Vexnum]; //记录每个顶点所在子树的根节点下标int * child = new int[Vexnum]; //记录每个顶点为根节点时,其有的孩子节点的个数int i;for (i = 0; i < Vexnum; i++) {parent[i] = i;child[i] = 0;}//对边集数组进行排序,按照权重从小到达排序qsort(edge_tag, edge, sizeof(Edge), cmp);int count_vex; //记录输出的边的条数count_vex = i = 0;while (i != edge) {//如果两颗树可以组合在一起,说明该边是生成树的一条边if (union_tree(edge_tag[i], parent, child)) {edge_tag[i].visit = true; for (int k = 0; k < m / 2; k++){u0[k] = edge_tag[k].start;v0[k] = edge_tag[k].end;}for (int k = m / 2; k < m; k++){u0[k] = edge_tag[k - m / 2].start;v0[k] = edge_tag[k - m / 2].end;}++count_vex; //生成树的边加1}//这里表示所有的边都已经加入成功if (count_vex == Vexnum - 1) {break;}++i;}if (count_vex != Vexnum - 1) {cout << "此图为非连通图!无法构成最小生成树。" << endl;}delete[] edge_tag;delete[] parent;delete[] child;}int main() {Kruskal();cout << endl;cout << "最终的最短路径是:";int i, j, u, v, degree, num = 0, start = 0;mem(e, 0);for (i = 0; i < m; i++){u = u0[i];v = v0[i];e[u - 1][v - 1] = e[v - 1][u - 1] = 1;}for (i = 0; i < n; i++){degree = 0;for (j = 0; j < n; j++)degree += e[i][j];if (degree & 1){start = i;num++;}}if (num == 0 || num == 2){fleury(start);}else{srand((unsigned)time(NULL));cout << "不存在欧拉回路!" << endl;} return 0;}补充:源码在底下推荐回答
C++代码转成JAVA的,很简单,因为语法基本一样,只要适当改下输入/输出函数就可以了,特别是你上面的,没有指针,没有C++特有的语法
问题是,你个图片让别人帮你手工输入有点过了。你要给出文本的源码,分分种就可帮你改好的。