C语言算法问题，矩阵排序。求大神

4个回答

WonderForce 哥们儿，首先感谢你的回答。但是我现在要处理的是海量的数据。而且我也知道他是用二维数组组装的。现在就是要处理传统算法不够高效的问题
4 年多之前 回复

WonderForce 比如说图中第二行第一列元素的值最大，所以为他的位置就是第一，把他的值7变为1
4 年多之前 回复

Sylvester矩阵算法构造的问题，采用C语言，谢谢大神
Problem Description A Hadamard matrix of order n is an n * n matrix containing only 1s and -1s, called Hn, such that where is the n * n identity matrix. An interesting property of Hadamard matrices is that they have the maximum possible determinant of any n * n matrix with elements in the range [-1, 1]. Hadamard matrices have applications in errorcorrecting codes and weighing design problems. The Sylvester construction is a way to create a Hadamard matrix of size 2n given . can be constructed as: for example: and so on. In this problem you are required to print a part of a Hadamard matrix constructed in the way described above. Input The first number in the input is the number of test cases to follow. For each test case there are ve integers: n, x, y, w and h. n will be between 1 and 2^62 (inclusive) and will be a power of 2. x and y specify the upper left corner of the sub matrix to be printed, w and h specify the width and height respectively. Coordinates are zero based, so 0 <= x,y < n. You can assume that the sub matrix will t entirely inside the whole matrix and that 0 < w,h <= 20. There will be no more than 1000 test cases. Output For each test case print the sub matrix followed by an empty line. Sample Input 3 2 0 0 2 2 4 1 1 3 3 268435456 12345 67890 11 12 Sample Output 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 1 1 1 1 -1 1 1 -1 1 -1 1 -1 1 -1
BP算法的C语言实现，代码个人测试正确， 但是wrong answer， 求大神指点
#include <stdlib.h> #include <math.h> #include <stdio.h> #include <time.h> #include <iostream> //#include "user.h" #include<cstdio> #include<iostream> #include<fstream> #include<cstdlib> #include<string> #include<algorithm> #define _CRT_SECURE_NO_WARNINGS #define _USE_MATH_DEFINES using namespace std; #define OUT_COUT 8 //输出向量维数 #define IN_COUT 72 //输入向量维数 #define COUT 792 //样本数量 #define NN 99 //单个样本数量 typedef struct { //bp人工神经网络结构 int h; //实际使用隐层数量 //double v[IN_COUT][IN_COUT/3]; //隐藏层权矩阵i,隐层节点最大数量为50 double v[IN_COUT/3][IN_COUT]; //double w[IN_COUT/3][OUT_COUT]; //输出层权矩阵 double w[OUT_COUT][IN_COUT/3]; double b1[IN_COUT/3]; double b2[OUT_COUT]; double x[COUT][IN_COUT]; double y[COUT][OUT_COUT]; double a; //学习率 double b; //精度控制参数 int LoopCout; //最大循环次数 } bp_nn; double fnet(double net) { //Sigmoid函数,神经网络激活函数 //return 1/(1+exp(-net)); return 2.0/(1+exp(-net))-1.0; } int InitBp(bp_nn *bp) { //初始化bp网络 /*printf("请输入隐层节点数，最大数为100：\n"); scanf_s("%d", &(*bp).h); printf("请输入学习率：\n"); scanf_s("%lf", &(*bp).a); //(*bp).a为double型数据，所以必须是lf printf("请输入精度控制参数：\n"); scanf_s("%lf", &(*bp).b); printf("请输入最大循环次数：\n"); scanf_s("%d", &(*bp).LoopCout);*/ (*bp).h = 24; (*bp).a = 0.4; (*bp).b = 0.0001; (*bp).LoopCout = 2000; int i, j; srand((unsigned)time(NULL)); for (i = 0; i < (*bp).h; i++) { for (j = 0; j < IN_COUT; j++) { (*bp).v[i][j] = rand() / (double)(RAND_MAX); } (*bp).b1[i] = rand()/(double)(RAND_MAX); } for (i = 0; i < OUT_COUT; i++) { for (j = 0; j < (*bp).h; j++) { (*bp).w[i][j] = rand() / (double)(RAND_MAX); } (*bp).b2[i] = rand()/(double)(RAND_MAX); } return 1; } int TrainBp(bp_nn *bp, double x[COUT][IN_COUT], double y[COUT][OUT_COUT]) { //训练bp网络，样本为x，理想输出为y double f = (*bp).b; //精度控制参数 double a = (*bp).a; //学习率 int h = (*bp).h; //隐层节点数 //double v[IN_COUT][IN_COUT/3], w[IN_COUT/3][OUT_COUT]; //权矩阵 double v[IN_COUT/3][IN_COUT], w[OUT_COUT][IN_COUT/3]; //权矩阵 double b1[IN_COUT/3],b2[OUT_COUT]; double ChgH[IN_COUT/3], ChgO[OUT_COUT]; //修改量矩阵 double O1[IN_COUT/3], O2[OUT_COUT]; //隐层和输出层输出量 int LoopCout = (*bp).LoopCout; //最大循环次数 int i, j, k, n; double temp; for (i = 0; i < h; i++) {// 复制结构体中的权矩阵 for (j = 0; j < IN_COUT; j++) { v[i][j] = (*bp).v[i][j]; } b1[i] = (*bp).b1[i]; } for (i = 0; i < OUT_COUT; i++) { for (j = 0; j < h; j++) { w[i][j] = (*bp).w[i][j]; } b2[i] = (*bp).b2[i]; } double e = f + 1; for (n = 0; e > f && n < LoopCout; n++) { //对每个样本训练网络 e = 0; for (i= 0; i < COUT; i++) { for (k= 0; k < h; k++) { //计算隐层输出向量 temp = 0; for (j = 0; j < IN_COUT; j++) temp = temp + x[i][j] * v[k][j]; O1[k] = fnet(temp+(*bp).b1[i]); } for (k = 0; k < OUT_COUT; k++) { //计算输出层输出向量 temp = 0; for (j = 0; j < h; j++) temp = temp + O1[j] * w[k][j]; O2[k] = fnet(temp+(*bp).b2[k]); } for (j = 0; j < OUT_COUT; j++) {//计算输出层的权修改量 ChgO[j] = O2[j] * (1 - O2[j]) * (y[i][j] - O2[j]); } for (j = 0; j < OUT_COUT ; j++) {//计算输出误差 e = e + (y[i][j] - O2[j]) * (y[i][j] - O2[j]); } for (j = 0; j < OUT_COUT; j++) { //计算隐层权修改量 temp = 0; for (k = 0; k < h; k++) temp = temp + w[j][k] * ChgO[k]; ChgH[j] = temp * O1[j] * (1 - O1[j]); } for (j = 0; j < OUT_COUT; j++) {//修改输出层权矩阵 for (k = 0; k < h; k++) { w[j][k] = w[j][k] + a * O1[j] * ChgO[k]; } } for (j = 0; j < h; j++) { for (k = 0; k < IN_COUT; k++) { v[j][k] = v[j][k] + a * x[i][j] * ChgH[k]; } } } if (n % 10 == 0) printf("误差 : %f\n", e); } printf("总共循环次数：%d\n", n); printf("调整后的隐层权矩阵：\n"); for (i = 0; i < h; i++) { for (j = 0; j < IN_COUT; j++) printf("%f ", v[i][j]); printf("\n"); } printf("调整后的输出层权矩阵：\n"); for (i = 0; i < OUT_COUT; i++) { for (j = 0; j < h; j++) printf("%f ", w[i][j]); printf("\n"); } for (i = 0; i < h; i++) {//把结果复制回结构体 for (j = 0; j < IN_COUT; j++) { (*bp).v[i][j] = v[i][j]; } (*bp).b1[i] = b1[i]; } for (i = 0; i < OUT_COUT; i++) { for (j = 0; j < h; j++) { (*bp).w[i][j] = w[i][j]; } (*bp).b2[i] = b2[i]; } printf("bp网络训练结束！\n"); return 1; } int UseBp(bp_nn *bp) { //使用bp网络 float Input[IN_COUT]; double O1[50]; double O2[OUT_COUT]; //O1为隐层输出,O2为输出层输出 while (1) { //持续执行，除非中断程序 printf("请输入3个数：\n"); int i, j; for (i = 0; i < IN_COUT; i++) scanf_s("%f", &Input[i]); double temp; for (i = 0; i < (*bp).h; i++) { temp = 0; for (j = 0; j < IN_COUT; j++) temp += Input[j] * (*bp).v[j][i]; O1[i] = fnet(temp-(*bp).b1[i]); } for (i = 0; i < OUT_COUT; i++) { temp = 0; for (j = 0; j < (*bp).h; j++) temp += O1[j] * (*bp).w[j][i]; O2[i] = fnet(temp-(*bp).b2[i]); } printf("结果： "); for (i = 0; i < OUT_COUT; i++) printf("%.3f ", O2[i]); printf("\n"); } return 1; } void readFP(double x[COUT][IN_COUT],double y[COUT][OUT_COUT]) { //bp_nn bp1; ifstream fileinput1; ifstream fileinput2; ifstream fileinput3; ifstream fileinput4; ifstream fileinput5; ifstream fileinput6; ifstream fileinput7; ifstream fileinput8; fileinput1.open("emgclose.txt"); fileinput2.open("emgopen.txt"); fileinput3.open("emgext.txt"); fileinput4.open("emgfle.txt"); fileinput5.open("emgsph.txt"); fileinput6.open("emgcyl.txt"); fileinput7.open("emgtri.txt"); fileinput8.open("emgkey.txt"); for(int m = 0;m< NN;++m) { for(int i =0;i < IN_COUT;++i) { fileinput1 >> x[m][i]; } } for(int m = NN;m<2*NN;++m) { for(int i =0;i < IN_COUT;++i) { fileinput2 >> x[m][i]; } } for(int m = 2*NN;m<3*NN;++m) { for(int i =0;i < IN_COUT;++i) { fileinput3 >> x[m][i]; } } for(int m = 3*NN;m<4*NN;++m) { for(int i =0;i < IN_COUT;++i) { fileinput4 >> x[m][i]; } } for(int m = 4*NN;m<5*NN;++m) { for(int i =0;i < IN_COUT;++i) { fileinput5 >> x[m][i]; } } for(int m = 5*NN;m<6*NN;++m) { for(int i =0;i < IN_COUT;++i) { fileinput6 >> x[m][i]; } } for(int m = 6*NN;m<7*NN;++m) { for(int i =0;i < IN_COUT;++i) { fileinput7 >> x[m][i]; } } for(int m = 7*NN;m<8*NN;++m) { for(int i =0;i < IN_COUT;++i) { fileinput8 >> x[m][i]; } } fileinput1.close(); fileinput2.close(); fileinput3.close(); fileinput4.close(); fileinput5.close(); fileinput6.close(); fileinput7.close(); fileinput8.close(); ifstream fileinput; fileinput.open("teach.txt"); for (int m2 = 0; m2 < OUT_COUT; m2++) { for (int i = 0; i < OUT_COUT; i++) { fileinput>>y[m2][i]; } for (int j = m2*NN; j < (m2+1)*NN; j++) { for (int k = 0; k < OUT_COUT; k++) { y[j][k] = y[m2][k]; } } } for (int i = 0; i < NN; i++) { for (int j = 0; j < OUT_COUT; j++) { y[i][j] = y[0][j]; } } fileinput.close(); double Mininput[IN_COUT] = {0.0}; double Maxinput[IN_COUT] = {0.0}; //找出训练的数据相应的最大值、最小值，为归一化做准备 for (int i = 0; i < IN_COUT; i++) { Mininput[i] = Maxinput[i] = x[0][i]; for (int j = 0; j < COUT; j++) { Mininput[i] = Mininput[i] < x[j][i]?Mininput[i]:x[j][i]; Maxinput[i] = Maxinput[i] > x[j][i]?Maxinput[i]:x[j][i]; } } //归一化处理 for (int i = 0; i < OUT_COUT; i++) { for (int j = 0; j < COUT; j++) { y[j][i] = 2.0*(y[j][i] - 0.0)/(1.0 - 0.0)-1.0; } } for (int i = 0; i < IN_COUT; i++) { for (int j = 0; j < COUT; j++) { //X[i][j] = (X1[i][j] - Mininput[i]+1)/(Maxinput[i] - Mininput[i]+1); x[j][i] = 2.0*(x[j][i] - Mininput[i])/(Maxinput[i] - Mininput[i])-1.0; } } } int main() { /* float x[COUT][IN_COUT] = {{0.8,0.5,0}, {0.9,0.7,0.3}, {1,0.8,0.5}, {0,0.2,0.3}, {0.2,0.1,1.3}, {0.2,0.7,0.8}}; //训练样本 int y[COUT][OUT_COUT] = {{0,1}, {0,1}, {0,1}, {1,0}, {1,0}, {1,0}}; */ //理想输出 bp_nn bp; readFP(bp.x,bp.y); InitBp(&bp); //初始化bp网络结构 TrainBp(&bp, bp.x, bp.y); //训练bp神经网络 // UseBp(&bp); //测试bp神经网络 return 1; }

#include <stdio.h> #include <stdlib.h> /**一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。 本题要求编写程序，求一个给定的n阶方阵的鞍点。 输入格式： 输入第一行给出一个正整数n（1≤n≤6）。随后nn行，每行给出n个整数，其间以空格分隔。 输出格式： 输出在一行中按照“行下标 列下标”（下标从0开始）的格式输出鞍点的位置。如果鞍点不存在，则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。 输入样例1： 4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 输出样例1： 2 1 输入样例2： 2 1 7 4 1 输出样例2： NONE**/ int main() { int a[10][10]; int n; int i,j; int max,maxi,maxj,c,leap; scanf("%d",&n); for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%d",&a[i][j]); } } for(i=0; i<n; i++) { leap=1; maxi=i; maxj=0; max=a[i][0]; for(j=1; j<n; j++) { if (max<a[i][j]) { max=a[i][j]; maxi=i; maxj=j; } } for(c=0;c<n;c++) { if(max>a[c][maxj]) { leap=0;break; } } if (leap) { break; } } if (leap) { printf ("%d %d",maxi,maxj); } else printf ("NONE"); return 0; }

C语言，寻找二维数组鞍点，代码个人测试正确， 但是wrong answer， 求大神指点
Description 给定一个海拔平面图，相当于一个二维数组，数组的每个元素表示一个点的海拔高度。请判断该图中是否存在鞍点，如果存在，则输出该鞍点的位置，即行、列坐标。 本题规定鞍点的定义为：该点的值在它所在的那行中是唯一最大的，且该点的值在它所在的那列中是唯一最小的。 Input 输入有多个测试用例，如果把每个测试用例看作一个"块"，那么，在一个"块"中： 第一行是两个正整数m和n，分别表示该平面图的行数和列数。0 < m, n ≤ 1000 接下来m行，每行n个非负整数，每个整数表示一个点的海拔高度。 测试数据保证如果存在鞍点，则只存在一个鞍点。 Output 对每个测试用例输出一行：如果该图存在鞍点，则输出该鞍点的行、列坐标。否则输出 -1 Sample Input 5 6 75 99 47 95 17 69 80 5 2 97 66 8 38 32 40 89 50 66 48 44 21 66 23 10 11 21 6 74 6 55 4 4 5 4 5 3 9 8 7 8 3 2 6 1 4 4 3 3 Sample Output 3 3 -1 ========================================== ``` #C# #include<stdio.h> int main(void){ int m, n, i, j, sum, c, max, min, xia1, xia2, d; static int z[1005][1005]; static int jie[1005][1005]={-1, -1, -1}; static int jie2[1005][1005]={-1, -1, -1}; while(scanf("%d%d", &m, &n)!=EOF){ for(i=1; i<=1003; i++) for(j=1; j<=1003; j++){ jie[i][j]=-1; jie2[i][j]=-1; } for(i=1; i<=m; i++) for(j=1; j<=n; j++) scanf("%d", &z[i][j]); //读入矩阵 for(i=1; i<=m; i++){ max=-9999; c=0; for(j=1; j<=n; j++) if(z[i][j]>=max) { max=z[i][j]; xia1=i; xia2=j;} for(j=1; j<=n; j++) if(z[i][j]==max) c++; if(c==1) jie[xia1][xia2]=z[xia1][xia2]; } //横向求最大项并作筛子jie记录 for(j=1; j<=n; j++){ min=9999; c=0; for(i=1; i<=m; i++) if(z[i][j]<=min) { min=z[i][j]; xia1=i; xia2=j;} for(i=1; i<=m; i++) if(z[i][j]==min) c++; if(c==1) jie2[xia1][xia2]=z[xia1][xia2]; } //纵向求最xiao项并作筛子jie2记录 d=0; for(i=1; i<=m; i++) for(j=1; j<=n; j++){ if(jie[i][j]==jie2[i][j]&&jie[i][j]!=-1&&jie2[i][j]!=-1) { printf("%d %d\n", i-1, j-1); d++; break; } if(d>0) break; } //两个筛子进行对比输出 if(d==0) printf("-1\n"); } return 0; } ``` 个人思路： 因为使用原始算法超时不通过， 所以改进思路： 定义jie和jie2两个和题目矩阵一样的二维数组（全部元素-1）， 把每一行唯一最大的元素记录如z[5][6 然后把jie[5][6]修改为那个值， 每一列同理jie2中，最后扫描整个jie和jie2，若两者相同且不为-1， 则项为鞍点。 求大神指点

``` void convert(int dim, int g[dim][dim]) { int i, j; for (i = 0; i < dim; i++) for (j = 0; j < i; j++) { g[i][j] = g[i][j] || g[j][i]; g[j][i] = g[i][j]; } } ``` 这是一个有向邻接矩阵转化为无向邻接矩阵的函数 求大神给出优化执行速度的方针 实在是不会。。。最好能有多几种优化方法和原理

/* * 将node链接到list的末尾 */ static void link_last(ENode *list, ENode *node) { ENode *p=list ; while(p->next_edge) p = p->next_edge; p->next_edge = node; } 编译会提示这方面里的错误 ![图片说明](https://img-ask.csdn.net/upload/201904/28/1556458124_943536.jpg) 0XFEFEFFEFE6表示明指针所指向的空间已经被释放 咋办 求大神解决 完整代码： #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #define MAX 100 #define INF (~(0x1<<31)) // 最大值(即0X7FFFFFFF) #define isLetter(a) ((((a)>='a')&&((a)<='z')) || (((a)>='A')&&((a)<='Z'))) #define LENGTH(a) (sizeof(a)/sizeof(a[0])) // 邻接表中表对应的链表的顶点 typedef struct _ENode { int ivex; // 该边的顶点的位置 int weight; // 该边的权 struct _ENode *next_edge; // 指向下一条弧的指针 }ENode, *PENode; // 邻接表中表的顶点 typedef struct _VNode { char data; // 顶点信息 ENode *first_edge; // 指向第一条依附该顶点的弧 }VNode; // 邻接表 typedef struct _LGraph { int vexnum; // 图的顶点的数目 int edgnum; // 图的边的数目 VNode vexs[MAX]; }LGraph; /* * 返回ch在matrix矩阵中的位置 */ static int get_position(LGraph G, char ch) { int i; for(i=0; i<G.vexnum; i++) if(G.vexs[i].data==ch) return i; return -1; } /* * 读取一个输入字符 */ static char read_char() { char ch; do { ch = getchar(); } while(!isLetter(ch)); return ch; } /* * 将node链接到list的末尾 */ static void link_last(ENode *list, ENode *node) { ENode *p=list ; while(p->next_edge) p = p->next_edge; p->next_edge = node; } /* * 创建邻接表对应的图(自己输入) */ LGraph* create_lgraph() { char c1, c2; int v, e; int i, p1, p2; int weight; ENode *node1, *node2; LGraph* pG; // 输入"顶点数"和"边数" printf("输入顶点数: "); scanf("%d", &v); printf("输入边数: "); scanf("%d", &e); if ( v < 1 || e < 1 || (e > (v * (v-1)))) { printf("input error: invalid parameters!\n"); return NULL; } if ((pG=(LGraph*)malloc(sizeof(LGraph))) == NULL ) return NULL; memset(pG, 0, sizeof(LGraph)); // 初始化"顶点数"和"边数" pG->vexnum = v; pG->edgnum = e; // 初始化"邻接表"的顶点 for(i=0; i<pG->vexnum; i++) { printf("顶点(%d): ", i); pG->vexs[i].data = read_char(); pG->vexs[i].first_edge = NULL; } // 初始化"邻接表"的边 for(i=0; i<pG->edgnum; i++) { // 读取边的起始顶点,结束顶点,权 printf("边(%d): ", i); c1 = read_char(); c2 = read_char(); scanf("%d", &weight); p1 = get_position(*pG, c1); p2 = get_position(*pG, c2); // 初始化node1 node1 = (ENode*)malloc(sizeof(ENode)); node1->ivex = p2; node1->weight = weight; // 将node1链接到"p1所在链表的末尾" if(pG->vexs[p1].first_edge == NULL) pG->vexs[p1].first_edge = node1; else{ link_last(pG->vexs[p1].first_edge, node1); } // 初始化node2 node2 = (ENode*)malloc(sizeof(ENode)); node2->ivex = p1; node2->weight = weight; // 将node2链接到"p2所在链表的末尾" if(pG->vexs[p2].first_edge == NULL) pG->vexs[p2].first_edge = node2; else{ link_last(pG->vexs[p2].first_edge, node2);} free(node1); free(node2); } return pG; } // 边的结构体 typedef struct _edata { char start; // 边的起点 char end; // 边的终点 int weight; // 边的权重 }EData; /* * 打印邻接表图 */ void print_lgraph(LGraph G) { int i; ENode *node; printf("List Graph:\n"); for (i = 0; i < G.vexnum; i++) { printf("%d(%c): ", i, G.vexs[i].data); node = G.vexs[i].first_edge; while (node != NULL) { printf("%d(%c) ", node->ivex, G.vexs[node->ivex].data); node = node->next_edge; } printf("\n"); } } /* * 获取G中边<start, end>的权值；若start和end不是连通的，则返回无穷大。 */ int getWeight(LGraph G, int start, int end) { ENode *node; if (start==end) return 0; node = G.vexs[start].first_edge; while (node!=NULL) { if (end==node->ivex) return node->weight; node = node->next_edge; } return INF; } /* * 获取图中的边 */ EData* get_edges(LGraph G) { int i; int index=0; ENode *node; EData *edges; edges = (EData*)malloc(G.edgnum*sizeof(EData)); for (i=0; i<G.vexnum; i++) { node = G.vexs[i].first_edge; while (node != NULL) { if (node->ivex > i) { edges[index].start = G.vexs[i].data; // 起点 edges[index].end = G.vexs[node->ivex].data; // 终点 edges[index].weight = node->weight; // 权 index++; } node = node->next_edge; } } return edges; } /* * 对边按照权值大小进行排序(由小到大) */ void sorted_edges(EData* edges, int elen) { int i,j; for (i=0; i<elen; i++) { for (j=i+1; j<elen; j++) { if (edges[i].weight > edges[j].weight) { // 交换"第i条边"和"第j条边" EData tmp = edges[i]; edges[i] = edges[j]; edges[j] = tmp; } } } } /* * 获取i的终点 */ int get_end(int vends[], int i) { while (vends[i] != 0) i = vends[i]; return i; } /* * 克鲁斯卡尔（Kruskal)最小生成树 */ void kruskal(LGraph G) { int i,m,n,p1,p2; int length; int index = 0; // rets数组的索引 int vends[MAX]={0}; // 用于保存"已有最小生成树"中每个顶点在该最小树中的终点。 EData rets[MAX]; // 结果数组，保存kruskal最小生成树的边 EData *edges; // 图对应的所有边 // 获取"图中所有的边" edges = get_edges(G); // 将边按照"权"的大小进行排序(从小到大) sorted_edges(edges, G.edgnum); for (i=0; i<G.edgnum; i++) { p1 = get_position(G, edges[i].start); // 获取第i条边的"起点"的序号 p2 = get_position(G, edges[i].end); // 获取第i条边的"终点"的序号 m = get_end(vends, p1); // 获取p1在"已有的最小生成树"中的终点 n = get_end(vends, p2); // 获取p2在"已有的最小生成树"中的终点 // 如果m!=n，意味着"边i"与"已经添加到最小生成树中的顶点"没有形成环路 if (m != n) { vends[m] = n; // 设置m在"已有的最小生成树"中的终点为n rets[index++] = edges[i]; // 保存结果 } } free(edges); // 统计并打印"kruskal最小生成树"的信息 length = 0; for (i = 0; i < index; i++) length += rets[i].weight; printf("Kruskal=%d: ", length); for (i = 0; i < index; i++) printf("(%c,%c) ", rets[i].start, rets[i].end); printf("\n"); } void main() { LGraph* pG; pG = create_lgraph(); print_lgraph(*pG); // 打印图 kruskal(*pG); // kruskal算法生成最小生成树 }

music算法的改进方案，结果不对，这是为什么？

Python十大装B语法
Python 是一种代表简单思想的语言，其语法相对简单，很容易上手。不过，如果就此小视 Python 语法的精妙和深邃，那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点，并附上详细的实例代码。如能在实战中融会贯通、灵活使用，必将使代码更为精炼、高效，同时也会极大提升代码B格，使之看上去更老练，读起来更优雅。 1. for - else 什么？不是 if 和 else 才

2019年11月中国大陆编程语言排行榜
2019年11月2日，我统计了某招聘网站，获得有效程序员招聘数据9万条。针对招聘信息，提取编程语言关键字，并统计如下： 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7

SQL-小白最佳入门sql查询一

“狗屁不通文章生成器”登顶GitHub热榜，分分钟写出万字形式主义大作

"狗屁不通文章生成器"登顶GitHub热榜，分分钟写出万字形式主义大作
GitHub 被誉为全球最大的同性交友网站，……，陪伴我们已经走过 10+ 年时间，它托管了大量的软件代码，同时也承载了程序员无尽的欢乐。 万字申请，废话报告，魔幻形式主义大作怎么写？兄dei，狗屁不通文章生成器了解一下。这个富有灵魂的项目名吸引了众人的目光。项目仅仅诞生一周，便冲上了GitHub趋势榜榜首（Js中文网 -前端进阶资源教程）、是榜首哦

《程序人生》系列-这个程序员只用了20行代码就拿了冠军

8年经验面试官详解 Java 面试秘诀

1.两种思维方式在求职面试中，经常会考察这种问题：北京有多少量特斯拉汽车？某胡同口的煎饼摊一年能卖出多少个煎饼？深圳有多少个产品经理？一辆公交车里能装下多少个乒乓球？一个正常成年人有多少根头发？这类估算问题，被称为费米问题，是以科学家费米命名的。为什么面试会问这种问题呢？这类问题能把两类人清楚地区分出来。一类是具有文科思维的人，擅长赞叹和模糊想象，它主要依靠的是人的第一反应和直觉，比如小孩...

so easy！ 10行代码写个"狗屁不通"文章生成器

&和&&都可作逻辑与的运算符，表示逻辑与（and），&是位运算符，你还需要知道这5个位运算符，基础很重要，云运算其实很骚！
MySQL数据库总结

20行Python代码爬取王者荣耀全英雄皮肤

2019年互联网寒冬，大批企业开始裁员，下图是网上流传的一张截图： 裁员不可避免，那如何才能做到不管大环境如何变化，自身不受影响呢？ 我们先来看一个有意思的故事，如果西游记取经团队需要裁员一名，会裁掉谁呢，为什么？ 西游记团队组成： 1.唐僧 作为团队teamleader，有很坚韧的品性和极高的原则性，不达目的不罢休，遇到任何问题，都没有退缩过，又很得上司支持和赏识(直接得到唐太宗的任命，既给袈...