有关的拓扑排序问题·

1.建立邻接表存储的图;
2.进行拓扑排序;
3.输出拓扑排序序列。
求完整过程

1个回答

所以你想表达什么。。。。。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
为什么拓扑排序算法不适合无向图的拓扑排序

为什么拓扑排序算法不适合无向图的拓扑排序 为什么拓扑排序算法不适合无向图的拓扑排序 为什么拓扑排序算法不适合无向图的拓扑排序

数据结构求解:如何列出所有的拓扑排序

数据结构求解:如何才能输出所有的拓扑排序,可以说下思路吗,最好可以给段代码理解。

求解,输出所有拓扑排序的思路

数据结构问题求解,求如何输出所有拓扑排序的思路,最好附上代码

拓扑排序(c++)不太懂,有没有大神,求教

最近要写拓扑排序的程序,然后作为一名渣渣,并不是特别懂。课本上说的只说了大致的,我只知道它的思想,却写不出程序来。有没有大神愿意教我(*´ο`*)

求这个图的拓扑排序的序列

![图片说明](https://img-ask.csdn.net/upload/201611/18/1479437856_354805.jpg) ![图片说明](https://img-ask.csdn.net/upload/201611/18/1479437871_514518.jpg) 图1 我用手工模拟可以得出abced,abecd,aebcd三个系列。 图2 根据算法来逐步演算,我没法得出abecd这个系列。我没法得出的原因是:a出栈后只有b和e的度数为0,从而be入栈。要得出abecd系列,b必须先于e出栈。我的疑惑就出在这里,b出栈后又会使c的入度变为0而使得c入栈,故c又先于e出栈,也就无法得出上述序列。 求各位解答。

跪求有向无环图所有可能的拓扑排序结果。感谢。

谢谢大家回答,LZ只会写一种排序,我设计的存储结构是邻接链表

echarts绘制拓扑图,实现可拖曳

``` series: [ { id: 'topology', type: 'graph', layout: 'none', symbolSize: 60, ``` layout为none,是固定的,不用force 怎样实现拖曳, onPointDragging事件不生效

用c#做教学计划编排问题

用c#(visual studio编译器)做教学计划编排问题 ![图片说明](https://img-ask.csdn.net/upload/201812/10/1544423208_69638.jpg)

判断有向图中在环中的顶点

在判断有向图中在一个环内的顶点时,我先递归删掉将入度为零的点和对应出度边(类似于拓扑排序),然后剩下的顶点中再去掉出度为零的顶点,那么最后剩下是不是一定在环里(假定只有一个环)?(纯新人求教)

数据结构: 帮忙回答一下下面的这个有关最坏情况下的时间复杂度问题

![图片说明](https://img-ask.csdn.net/upload/201510/31/1446301784_328804.png)

神经网络SOM网络节点重新排布的问题

跟着网上的例子用MATLAB自己编了个输出二维的SOM网,网络学习后权值的调整这些都没问题,但是权值矩阵中那些聚类中心的权值还是初始化时候的节点数,缺少这一步去画图的时候就没法把相似的类靠在一起,所以有什么方法能让节点在调整后能重新排布呢?

对给定的图结构,实现求解最小生成树的Kruskal算法,并给出求解过程的动态演示。

我想问的是,这个算法编写出来的代码怎么运行实现动态演示,不会。。求高手赐教

新手求助,数据结构课设的源程序,麻烦大佬们看下注释一下,搞不懂啥意思?

_#pragma once_ _#include<stdio.h>_ _#include<stdlib.h>_ _#define MAX 20_ _#define DataType char_ _ typedef struct ArcNode { int _Adjvex; //储存边所指的顶点位置 int _Weight; //储存该边的权重 int _Ee; //活动最早发生时间 int _El; //活动最晚发生时间 struct ArcNode *_NextArc; //指向下一条边的指针 }ArcNode; typedef struct VexNode { DataType _data; //顶点信息 int _InDegree; //入度 int _Flag; //拓扑排序是用来判断是否排过 int _Ve; //事件最早发生时间 int _Vl; //事件最晚发生时间 ArcNode *_FirstArc; //指向第一条依附该顶点的弧 }VexNode; typedef struct ALGraph { VexNode *_AdjList; //邻接表 int _VexNum; //结点数目 int _ArcNum; //边的数目 }ALGraph; int menu_select() { int i; do { system("cls"); printf("\t\t ╭——————————■□■□—————╮\n"); printf("\t\t│ 数 据 结 构 课 程 设 计 │\n"); printf("\t\t╰———■□■□————————————╯\n"); printf("\t\t ┌————————————————┐\n"); printf("\t\t │ 1. 用邻接表存储有向图 │\n"); printf("\t\t │ │\n"); printf("\t\t │ 2. 显 示 邻 接 表 │\n"); printf("\t\t │ │\n"); printf("\t\t │ 3. 拓 扑 排 序 │\n"); printf("\t\t │ │\n"); printf("\t\t │ 4. 逆 拓 扑 排 序 │\n"); printf("\t\t │ │\n"); printf("\t\t │ 5. 关 键 活 动 │\n"); printf("\t\t │ │\n"); printf("\t\t │ 0.退出 │\n"); printf("\t\t └————————————————┘\n"); printf("\t\t请选择(0-5):"); scanf("%d", &i); } while (i < 0 || i>5); return i; } void ClearStdin() { char ch; while ((ch = getchar()) != '\n' && ch != EOF); } int IfHaveThisVex(ALGraph* graph, DataType data) { //判断该顶点是否在_AdjList(Vex数组)中 //存在返回所在位置下标,不存在返回-1 for (int i = 0; i < graph->_VexNum; ++i) { if (graph->_AdjList[i]._data == data) { return i; } } return -1; } void CreatAdjList(ALGraph* graph) { int Weight; int FirstIndex, SecondIndex; //定义两个index存放边的两个顶点在数组中的下标 DataType FirstVex, SecondVex; //定义一个边的两个顶点值,用于接收用户输入的边的两个顶点信息 for (int i = 0; i < graph->_VexNum; ++i) { ClearStdin(); //清空输入缓冲区 //对已经malloc出来的每个顶点初始化 printf("请输入第%d个顶点的信息(例如顶点名为A,则输入A):", i + 1); scanf("%c", &(graph->_AdjList[i]._data)); graph->_AdjList[i]._Flag = 0; graph->_AdjList[i]._Ve = 0; graph->_AdjList[i]._Vl = INT_MAX; graph->_AdjList[i]._InDegree = 0; graph->_AdjList[i]._FirstArc = NULL; } system("cls"); for (int i = 0; i < graph->_ArcNum; ++i) { ClearStdin(); //清空输入缓冲区 printf("请输入有向图中第%d边的两个顶点以及权重(例:A->B权重5 则输入A B 5):", i + 1); scanf("%c %c %d", &FirstVex, &SecondVex, &Weight); FirstIndex = IfHaveThisVex(graph, FirstVex); SecondIndex = IfHaveThisVex(graph, SecondVex); if (FirstIndex == -1 || SecondIndex == -1) { i = i - 1; printf("输入顶点信息错误,请重新输入!!\n"); continue; } ArcNode * NewArc = (ArcNode*)malloc(sizeof(ArcNode)); NewArc->_Adjvex = SecondIndex; NewArc->_Weight = Weight; NewArc->_NextArc = graph->_AdjList[FirstIndex]._FirstArc; graph->_AdjList[FirstIndex]._FirstArc = NewArc; graph->_AdjList[SecondIndex]._InDegree++; } } void ALGraphInit(ALGraph* graph) { system("cls"); printf("请输入有向图顶点的个数:"); scanf("%d", &(graph->_VexNum)); printf("请输入有向图边的条数:"); scanf("%d", &(graph->_ArcNum)); graph->_AdjList = (VexNode*)malloc(sizeof(VexNode)*(graph->_VexNum)); CreatAdjList(graph); } void PrintfVexNode(VexNode *node) { ArcNode* cur = node->_FirstArc; printf("[%c]", node->_data); if (cur) { printf("-->[ %d ]", cur->_Adjvex); cur = cur->_NextArc; } while (cur) { printf("-->[ %d ]", cur->_Adjvex); cur = cur->_NextArc; } printf("-->[NULL]\n"); } void PrintfAdjList(ALGraph* graph) { system("cls"); for (int i = 0; i < graph->_VexNum; ++i) { printf("%d ", i); PrintfVexNode(&(graph->_AdjList[i])); } system("pause"); } void TopologicalSorting(ALGraph* graph,int *arr) { system("cls"); if (arr[MAX - 1] == 1) { printf("该图已经进行过拓扑排序!\n"); system("pause"); return; } int count = 0; int flag = 1; while (flag) { flag = 0; for (int i = 0; i < graph->_VexNum; ++i) { if (graph->_AdjList[i]._InDegree == 0 && graph->_AdjList[i]._Flag == 0) { flag = 1; graph->_AdjList[i]._Flag = 1; arr[count] = i; count++; ArcNode* cur = graph->_AdjList[i]._FirstArc; while (cur) { if (cur->_Weight + graph->_AdjList[i]._Ve > graph->_AdjList[cur->_Adjvex]._Ve) { graph->_AdjList[cur->_Adjvex]._Ve = cur->_Weight + graph->_AdjList[i]._Ve; } graph->_AdjList[cur->_Adjvex]._InDegree--; cur = cur->_NextArc; } break; } } } for (int i = 0; i < count; ++i) { printf("[%c][Ve: %d]\n", graph->_AdjList[arr[i]]._data, graph->_AdjList[arr[i]]._Ve); } printf("[NULL]\n"); if (count < graph->_VexNum) { printf("事件输出数量小于总数量,图中带环!!\n"); } else { arr[MAX - 1] = 1; printf("事件输出数量等于总数量,图中不带环!!\n"); } system("pause"); } void RTopologicalSorting(ALGraph* graph, int *arr) { system("cls"); if (arr[MAX - 1] == 0) { printf("请确保次图不带环并且已进行过拓扑排序后再试!\n"); system("pause"); return; } graph->_AdjList[arr[graph->_VexNum - 1]]._Vl = graph->_AdjList[arr[graph->_VexNum - 1]]._Ve; for (int i = graph->_VexNum - 2; i >= 0; --i) { ArcNode *cur = graph->_AdjList[arr[i]]._FirstArc; while (cur) { if ((graph->_AdjList[cur->_Adjvex]._Vl) - (cur->_Weight) < graph->_AdjList[arr[i]]._Vl) { graph->_AdjList[arr[i]]._Vl = (graph->_AdjList[cur->_Adjvex]._Vl) - (cur->_Weight); } cur = cur->_NextArc; } } for (int i = graph->_VexNum - 1; i >= 0; --i) { printf("[%c][Ve: %d]\n", graph->_AdjList[arr[i]]._data, graph->_AdjList[arr[i]]._Vl); } arr[MAX - 2] = 1; //printf("[NULL]"); system("pause"); } void KeyActivites(ALGraph* graph, int *arr) { system("cls"); if (arr[MAX - 2] == 0 || arr[MAX - 1] == 0) { printf("请确保该图进行过拓扑排序及逆拓扑排序后再试\n"); system("pause"); return; } for (int i = 0; i < graph->_VexNum; ++i) { ArcNode* cur = graph->_AdjList[arr[i]]._FirstArc; while (cur) { cur->_Ee = graph->_AdjList[arr[i]]._Ve; cur->_El = graph->_AdjList[cur->_Adjvex]._Vl; printf("活动[%c]-->[%c]的最早发生时间:%d 最晚发生时间:%d\n", graph->_AdjList[arr[i]]._data, graph->_AdjList[cur->_Adjvex]._data, cur->_Ee, cur->_El); cur = cur->_NextArc; } } printf("-------------------------------------------\n"); printf("关键路径如下:\n"); for (int i = 0; i < graph->_VexNum; ++i) { ArcNode* cur = graph->_AdjList[arr[i]]._FirstArc; while (cur) { //顶点的最早发生时间和最晚发生时间相等即在关键路径上 if (graph->_AdjList[arr[i]]._Ve == graph->_AdjList[arr[i]]._Vl &&graph->_AdjList[cur->_Adjvex]._Ve == graph->_AdjList[cur->_Adjvex]._Vl) { printf("活动[%c]-->[%c] 长度:%d\n", graph->_AdjList[arr[i]]._data, graph->_AdjList[cur->_Adjvex]._data, cur->_Weight); } cur = cur->_NextArc; } } system("pause"); } int main() { ALGraph G; int arr[MAX]; //存放拓扑排序顺序 arr[MAX - 1] = 0; //标志位来判断是否进行过拓扑排序 arr[MAX - 2] = 0; //标志位来判断是否进行过逆拓扑排序 while (1) { switch (menu_select()) { case 1: ALGraphInit(&G); break; case 2: PrintfAdjList(&G); break; case 3: TopologicalSorting(&G,arr); break; case 4: RTopologicalSorting(&G, arr); break; case 5: KeyActivites(&G, arr); break; case 0: printf("\t\t系统退出!!\n"); system("pause"); exit(0); } } } ``` ```

有向无环图最长路径,自己运行可以,提交OJ为Wrong Anwser,向各位大佬求教!

1.问题描述: 求有向无环图的最长路径,如有多条的,输出字典序最小值。 ** 输入:**第一行两个整数 n、m。表示有 n 个节点,编号 1 ~ n;接下来有 m 行,每行三个整数 a、b、weight。 **输出:**若干空格分隔的整数,连成一条weight和最大的路线。若有多条,输出字典序最小的那条路线。 ![图片说明](https://img-ask.csdn.net/upload/202005/06/1588736756_211303.png) 2.我的代码 ``` #include <iostream> using namespace std; int DP(int i); void printPath(int i); int TopoSort(int* arr); int n = 100000; int* dp = new int [n + 1]; int** G = new int* [n + 1]; int* choice = new int [n + 1]; //记录最长路径的后继顶点 int* od = new int [n + 1]; //out-degree int main(){ int m; cin >> n >> m; for (int i = 0; i <= n; i ++) G[i] = new int[n]; for (int i = 0; i <= n; i ++) for (int j = 0; j <= n; j ++) G[i][j] = -1; for (int i = 0; i <= n; i ++){ od[i] = 0; dp[i] = 0; choice[i] = -1; } int a, b, price; for (int i = 0; i < m; i ++){ cin >> a >> b >> price; G[a][b] = price; od[a] ++; } int* tp = new int [n + 1]; for (int i = n; i >= 1; i --) //零出度拓扑排序 tp[i] = TopoSort(od); for (int i = n; i >= 1; i --) //按照拓扑排序的逆序,依次计算节点的max-path dp[tp[i]] = DP(tp[i]); int max_v = 0; int max_l = 0; for (int i = 1; i <= n; i ++) if(dp[i] > max_l){ max_l = dp[i]; max_v = i; } printPath(max_v); return 0; } int DP(int i){ if (dp[i] > 0) return dp[i]; for (int j = 1; j <= n; j ++){ //遍历i的所有出边 if(G[i][j] != -1){ int temp = DP(j) + G[i][j]; if (temp > dp[i]){ dp[i] = temp; choice[i] = j; } } } return dp[i]; } void printPath(int i){ cout << i << ' '; while(choice[i] != -1){ i = choice[i]; cout << i << ' '; } } int TopoSort(int* arr){ for (int i = n; i >= 1; i --) if (arr[i] == 0){ arr[i] = -1; for (int j = 1; j <= n; j ++) if (G[j][i] != -1) od[j] --; return i; } } ``` 十分感激!!! (时间和空间的一些限制不想管它惹……只想捞一下最基本的Wrong Answer。QAQ

程序错误求修改!!!!

请问下面代码段中有向图邻接表的建立错在哪了??求帮助!!!! #include<iostream> using namespace std; #define MaxVertexNum 50 typedef struct edge //建立邻接表存储结构,边表 {int AdjVertex; //邻接点域 struct edge *NextEdge; //指向下一个边结点 }EdgeType; typedef struct //建立顶点表 {int Vertex; //顶点信息 int indegree; //入度域 EdgeType *FirstEdge; //邻接表头指针 }VertexType; typedef VertexType adjlist[MaxVertexNum]; //定义adjlist为邻接表类型 void Toposort(adjlist GL,int n) //拓扑排序 {int top=0; int tpv[12]; EdgeType *t; int i,j,k; for(i=1;i<=n;i++) //建立入度为0的顶点栈,邻接表数组中下标为0的元素未用 if(GL[i].indegree==0) {GL[i].indegree=top; top=i; } i=0; //i为已产生的拓扑序列的顶点个数 while(top!=0) {j=top; //取得栈顶的顶点j top=GL[top].indegree; //更新栈顶指示器 tpv[++i]=j; //输出顶点j t=GL[j].FirstEdge; //取邻接表的第j个链表表头结点 while(t!=NULL) {k=t->AdjVertex; //取顶点值 if(--(GL[k].indegree)==0) //顶点k的入度减1后是为0 {GL[k].indegree=top; //顶点k进栈 top=k; } t=t->NextEdge; //顶点j的下一个后继结点 } } if(i<n) cout<<"图中有回路!"<<endl; //输出的顶点数小于图中顶点数 else if(i>=n) {cout<<"拓扑序列为:"; //输出拓扑序列 for(i=1;i<=n;i++) cout<<tpv[i]<<endl; } } void main() {int i,j,k,n,e,I; int v1,v2; EdgeType *p,*q; adjlist Graph; cout<<"输入图中顶点的个数n和边数e:"; //输入邻接表的数据 cin>>n>>e; cout<<"输入顶点的数据:"; //输入顶点的数据 for(k=0;k<n;k++) {cin>>Graph[k].Vertex; Graph[k].FirstEdge=NULL; } cout<<"输入个顶点的入度:"; for(k=0;k<n;k++) {cin>>I;} cout<<"输入图中各边:"; //输入图中各边 for(k=0;k<e;k++) {cin>>v1>>v2; i=v1; //找到v1的序号 j=v2; //找到v2的序号 q=new EdgeType; q->AdjVertex=j; q->NextEdge=Graph[i].FirstEdge; Graph[i].FirstEdge=q; p=new EdgeType; p->AdjVertex=i; p->NextEdge=Graph[j].FirstEdge; Graph[j].FirstEdge=p; } cout<<"图的邻接表结构为:"<<endl; //输出图的邻接表结构 for(i=0;i<n;i++) {cout<<"i="<<i<<endl; v1=Graph[i].Vertex; cout<<"Vertex:"<<v1; p=Graph[i].FirstEdge; while(p!=NULL) {v2=p->AdjVertex; cout<<"-->"<<v2; p=p->NextEdge; } cout<<endl; } Toposort(Graph,12); }

自己初始化邻接表数据有问题 (注视是瞎写的)如果还有其他问题也请帮忙改一下

#include"stdio.h" #include"stdlib.h" #define MAX_VERTEX_NUM 20 #define InfoType int #define VertexType char #define MaxSize 100 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define SElemType int #define Status int #define OVERFLOW -1 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack &S) { S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return 1; } Status GetTop(SqStack S, SElemType &e) { if (S.base == S.top)return 0; e = *(S.top - 1); return 1; } Status Push(SqStack &S, SElemType e) { if (S.top - S.base == 0) { S.base = (SElemType*)realloc(S.base, (STACK_INIT_SIZE + STACKINCREMENT) * sizeof(SElemType)); if (!S.base)exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize = STACK_INIT_SIZE + STACKINCREMENT; } *(S.top++) = e; return 1; } Status Pop(SqStack &S, SElemType &e) { if (S.base == S.top) return 0; e = *--S.top; return 1; } Status StackEmpty(SqStack S) { if (S.top - S.base == 0) return 1; else return 0; } typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; int weight; }ArcNode; typedef struct VNode { VertexType data; ArcNode *firstarc; }VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertex; int vexnum, arcnum; int kind; }ALGraph; int indegree[MaxSize]; int ve[MaxSize];//定义事件最早发生 (vertex earliest) int vl[MaxSize];//定义事件最迟发生 (vertex lastest) void CreateDGAOV(ALGraph *G) { int i, j, k; ArcNode *e; printf("输入顶点和边:\n"); scanf_s("%d,%d", &G->vexnum, &G->arcnum); getchar(); printf("请初始化顶点\n"); for (i = 0; i < G->vexnum; i++) { printf("输入顶点字符:\n"); scanf_s("%c", &G->vertex[i].data); G->vertex[i].firstarc = NULL; getchar(); } for (k = 0; k < G->arcnum; k++) { printf("输入边(vi,vj)上的顶点序号:\n"); scanf_s("%d,%d", &i, &j); e = (ArcNode*)malloc(sizeof(ArcNode)); e->adjvex = j; e->nextarc = G->vertex[i].firstarc; G->vertex[i].firstarc = e; } } Status CreateDGAOE(ALGraph *G) { VNode v1, v2; int i, j, sign1, sign2; int value; printf("创建AOE\n"); printf("请输入顶点数和边数:"); scanf_s("%d,%d", &G->vexnum, &G->arcnum); getchar(); printf("请初始化顶点\n"); for (i = 0; i < G->vexnum; i++) { printf("输入顶点字符:\n"); scanf_s("%c", &G->vertex[i].data); G->vertex[i].firstarc = NULL; getchar(); } printf("请初始化弧\n"); printf("输入格式:顶点1 顶点2 权值(表示顶点1邻接到顶点2)\n\n"); for (i = 0; i < G->arcnum; i++) { ArcNode *p, *q; sign1 = -1; sign2 = -1; scanf_s("%c%c%d", &v1.data, &v2.data, &value); getchar(); for (j= 0; j< G->vexnum; j++) { if (v1.data == G->vertex[j].data) sign1 = j; if (v2.data == G->vertex[j].data) sign2 = j; } p = (ArcNode*)malloc(sizeof(ArcNode)); if (!p) exit(OVERFLOW); p->nextarc = NULL; p->weight = value; p->adjvex = sign2; q = G->vertex[sign1].firstarc; if (!q) G->vertex[sign1].firstarc = p; else { while (q->nextarc != NULL) q = q->nextarc; q->nextarc = p; } } return 1; } void FindInDegree(ALGraph G)//计算每个节点的入度; { ArcNode *p; int i, k; for (i = 0; i < G.vexnum; i++) indegree[i] = 0; for (i = 0; i < G.vexnum; i++) { p = G.vertex[i].firstarc; while (p != NULL) { k = p->adjvex; indegree[k]++; p = p->nextarc; } } } int TopologicalSort(ALGraph &G)//拓扑排序的实现 { int i, k, count = 0; SqStack S; ArcNode *p; FindInDegree(G); InitStack(S); printf("TopologicalSort:"); for (i = 0; i < G.vexnum; i++)//将入度为0的顶点的下标号压入顺序栈S if (!indegree[i]) Push(S, i); while (!StackEmpty(S))//如果栈不为空 { Pop(S, i);//弹出栈顶存储的顶点的下标号 printf("%3c", G.vertex[i].data);//输出下标号为i的顶点中的数据; count++;//每弹出一次,count就加一,全部输出后应该是vexnum的值,可由这个来判断G有没有环; for (p = G.vertex[i].firstarc; p; p = p->nextarc)//令p指向顶点的firstarc也就是指向顶点节点后的第一个边结点,等到p指向NULL时循环结束 { k = p->adjvex;//令k指向p节点的下标号; if (--indegree[k] == 0)//先将这个节点的入度-1如果=0,那么就将它入栈 Push(S, k); } } if (count < G.vexnum) { printf("The directed graph has a loop\n"); return 0; } else return 1; } Status TopologicalOrder(ALGraph G, SqStack &T) { SqStack S; ArcNode *p; int i, x, k, count = 0; FindInDegree(G); InitStack(T); for (i = 0; i < G.vexnum; i++)//将时间最早发生初始化 ve[i] = 0; for (i = 0; i < G.vexnum; i++)//将入度为0的顶点入栈; { if (indegree[i] == 0) Push(S, i); } while (!StackEmpty(S)) { Pop(S, x); Push(T, x);//将弹出来的顶点下标压入栈T count++; for (p = G.vertex[x].firstarc; p; p = p->nextarc)//注意p指向的是边节点 { k = p->adjvex; if (--indegree[k] == 0) { Push(S, k); } if (ve[x] + (p->weight) > ve[k])//取最早完成时间里的最大值 { ve[k] = ve[x] + (p->weight); } } if (count < G.vexnum) return 0; else return 1; } } Status CriticalPath(ALGraph G) { int i, k, x; int ee, el; ArcNode *p; SqStack T; InitStack(T); TopologicalOrder(G, T); for (i = 0; i < G.vexnum; i++) vl[i] = ve[G.vexnum - 1]; while (!StackEmpty(T)) { Pop(T, x); for (p = G.vertex[i].firstarc; p; p = p->nextarc) { k = p->adjvex; if (vl[x] > vl[k] - p->weight)//取最迟时间中最小值 vl[x] = vl[k] - p->weight; } } for (i = 0; i < G.vexnum; i++); { for (p = G.vertex[i].firstarc; p; p = p->nextarc) { k = p->adjvex; ee = ve[i]; el = vl[k] - p->weight; } printf("Criticalpath:<%d,%d>length:%d\n", i, k, p->weight); } return 1; } int main() { //ALGraph G; //CreateDGAOV(&G); //TopologicalSort(G); //printf("\n"); ALGraph N; CreateDGAOE(&N); CriticalPath(N); return 0; }

用c语言版写的求解关键路径,调试到一半按任意键继续就关了,求大神看看我的代码

c语言版写的求解关键路径,调试到一半按任意键继续就关了,求大神看看我的代码,大一刚学 只能到建立完邻接表 `` #include < stdio.h> #include< stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define MAXSIZE 100 #define MVNum 100 //最大顶点 #define NUM 10000 //最大边数 typedef int SElemType; typedef int Status; typedef char VerTexType; typedef int Status; typedef struct ArcNode //邻接表存储表示 { int adjvex; //顶点所在位置 int weight; //权值 struct ArcNode *nextarc; //链域 (指向下一条边结点) }ArcNode; typedef struct VNode { VerTexType data; ArcNode *firstarc; }VNode,AdjList[MVNum]; typedef struct { AdjList vertices; //邻接表 int vexnum,arcnum; //图的当前顶点数和边数 }ALGraph; typedef struct //定义栈 { SElemType *base; SElemType *top; int stacksize; }SqStack; SqStack S; int indegree[MVNum]; ///用数组indegree来存放各顶点的入度 int ve[NUM]; //事件发生最早的时间 int vl[NUM]; //事件发生最迟的时间 int topo[MVNum]; //初始化 void InitStack(SqStack *S) { S->base=(SElemType*)malloc(sizeof MAXSIZE); if(!S->base) return ; S->top=S->base; S->stacksize=MVNum; } //入栈 void Push(SqStack *S,SElemType e) { if(S->top-S->base==S->stacksize) return ; *S->top++=e; } //出栈 void Pop(SqStack *S,SElemType e) { if(S->top==S->base) return ; e=*--S->top; } //判断是否为空 Status StackEmpty(SqStack *S) { if(S->top==S->base) return OK; else return ERROR; } int LocateVex(ALGraph G,VerTexType v) { int i; for(i=0;i<G.vexnum;++i) if(v==G.vertices[i].data) return i; return -1; } int CreateUDG(ALGraph *G) ////建立邻接表 { ArcNode *p=(ArcNode *)malloc(sizeof(ArcNode)); int i,k; printf("请输入总的顶点数:"); scanf("%d",&G->vexnum);///图的顶点数 printf("请输入总的边数:"); scanf("%d",&G->arcnum);///图的边数 for(i=0;i<G->vexnum;++i) { printf("请输入每个顶点的值:"); scanf("%d",&G->vertices[i].data); G->vertices[i].firstarc=NULL; //顶点的第一个指针域为空 } for(k=0;k<G->arcnum;++k) { int v1,v2; int i,j,w; printf("请依次输入起点 权值 终点(空格分开):"); scanf("%d %d %d",&v1,&w,&v2); i=LocateVex(*G,v1); j=LocateVex(*G,v2); p->adjvex=j; //顶点 p->nextarc=G->vertices[i].firstarc; G->vertices[i].firstarc=p; //有向图 p->weight=w;////权值 } return OK; } void FindInDegree(ALGraph G,int indegree[]) //把顶点的入度放到数组中 { int i,t; ArcNode *p=(ArcNode *)malloc(sizeof(G.vertices[i].firstarc)); for(i=0;i<G.vexnum;i++) { t=0; //使p指向第一个邻接点 if(p){ while(p){ p=p->nextarc; //p指向下一个邻接点 t++; //有指向的话 就加一 } } indegree[i]=t; } } ////拓扑排序 int TopologicalSort(ALGraph G,int topo[]) { int i,m; FindInDegree(G,indegree); //各顶点的入度 InitStack(&S); //初始栈 for(i=0;i<G.vexnum;++i) if(!indegree[i]) //如果没有前驱的话 Push(&S,i); //进栈 (等于图中没有那个顶点了) m=0;//计数 while(!StackEmpty(&S)) { ArcNode *p=(ArcNode *)malloc(sizeof(G.vertices[i].firstarc)); Pop(&S,i);//出栈 topo[m]=i; ++m; p=G.vertices[i].firstarc; while(p!=NULL) { int k; k=p->adjvex; --indegree[k]; if(indegree[k]==0) //就剩一个了 直接入栈 Push(&S,k) ; p=p->nextarc; } } if(m<G.vexnum) return ERROR; //拓扑排序不能有回路 else return OK; } ////关键路径 int CriticalPath(ALGraph G) { int n,i,k,j,e,l; ArcNode *p=(ArcNode *)malloc(sizeof(G.vertices[i].firstarc)); if(!TopologicalSort(G,topo)) return ERROR; n=G.vexnum; for(i=0;i<n;i++) { ve[i]=0; //最早发生的时间初值为零 } for(i=0;i<n;i++) { k=topo[i]; p=G.vertices[k].firstarc; //p指向第一个邻接点 while(p!=NULL) { j=p->adjvex; if(ve[j]<ve[k]+p->weight) ve[j]=ve[k]+p->weight; ///最早发生时间更新 p=p->nextarc;///p指向下一个邻接点 } } for(i=0;i<n;i++) { vl[i]=ve[n-1]; //最迟发生时间初值 } for(i=n-1;i>=0;i--) { k=topo[i]; p=G.vertices[k].firstarc; //p指向第一个邻接点 while(p!=NULL) { j=p->adjvex; //邻接点的序号 if(vl[k]<vl[j]-p->weight) vl[k]=vl[j]-p->weight; ///最迟发生时间更新 p=p->nextarc;///p指向下一个邻接点 } } ///判断是否为关键活动 printf("关键路径:"); for(i=0;i<n;i++) { ArcNode *p=(ArcNode *)malloc(sizeof(G.vertices[i].firstarc)); p=G.vertices[i].firstarc; while(p!=NULL) { j=p->adjvex; //顶点的位置 e=ve[i]; l=vl[j]-p->weight; if(e==1) printf("<v%d,v%d>",G.vertices[i].data,G.vertices[j].data); printf("为关键路径"); p=p->nextarc; } } return OK; } int main() { ALGraph *G=(ALGraph *)malloc(sizeof(ALGraph)); CreateUDG(G); TopologicalSort(*G,topo); CriticalPath(*G); return 0; }` ```

数据结构课程设计求各位大神帮忙要代码就好

《数据结构》课程设计指导意见 1、 课程设计的题目和适用范围 题目:工程的工期计算。 该指导意见只供2015级计算机科学与技术1~6班同学参考。 2、 课程设计的目的 数据结构是计算机科学与技术、信息管理、数媒专业的重要的专业基础课,是计算机系统软件和应用软件开发的重要理论和技术。课程设计内容主要用到图的结构。所以课程设计目的要求掌握AOE网,关键路径、事件的最早发生时间、事件的最迟发生时间、活动的最早开始时间、活动的最迟开始时间的计算,以便求出关键路径的长度和完成一项工挰所需时间。(即工程的工期 ) 3、课程设计的内容 已知有向网,图中各顶点代表事件,有向边代表活动,权表示完成活动所需时间(天数) 。求以下内容: ·事件的最早开始时间和最晚开始时间。 ·每项活动的最早开始时间和最迟开始时间。 ·关键活动和关键路径。 ·完成工程最少需要的天数。(工期) ·是否存在某项活动,当其提高速度后能使整个工程缩短工期? ​​ 4 6 2 ​a3=3​a7=4 a1=5​a12=4 1 10 ​a4=6​a6=3 7 ​a10=5 9 5 3 a2=6​a8=1​a13=2 8 ​ ​a5=3​a9=4​a11=2 (1) 事件计算公式 · 事件Vk的最早发生时间Ve(k),是指从源点V1到Vk的最长路径长度。这个时间决定了所有从VK发出的弧所表示的活动能够开工的最早日期。计算公式如下: Ve(1)=0 Ve(k)=max{Ve(j)+dut(<j,k >) }上的权。 上述公式是一个从源点开始的递推公式,Ve(K)的计算必须在Vk的所有前驱顶点的最早发生时间全部求出后才能进行。 ·事件Vi 的最迟发生时间Vl(i) ,是指在不拖延整个工程工期的情况下,事件Vi所允许的最晚发生时间。其数值是从汇点的最早发生时间Ve(n)=Vl(n). 其它顶点的最晚发生时间都应从汇点开始,向源点方向递推求得,计算公式事下: Vl(n)= Ve(n) Vl(i)= min{Vl(j)-dut(<I,j>) }上的权. Vl(i) 的计算必须在顶点I 的所有后继顶点的最晚发生时间全部求出后才能进行。 (2)活动计算公式 ·活动ai 的最早开始时间e(i),( 设边< Vj,Vk> 表示活动ai,) 则有: e(i)=Ve(j) 说明活动ai的最早开始时间等于事件Vj 的最早发生时间。 ·活动ai 的最迟开始时间 l(i), (设边< Vj,Vk> 表示活动ai) ,是指不推迟整个工程工期的情况下,允许该活动最晚开始的时间。则计算公式如下: l(i) = Vl(k)-dut(<j,k>) 即该活动的终点所表示的事件最迟发生时间与该活动所需时间之差。 (3)关键路径计算 l(i) -e(i) =0,即l(i)=e(i)的活动ai 是关键活动。 若l(i) -e(i) ≠0 ,其时间余量表示不影响工期的情况下,活动可以拖延的时间。 4、要求 (1)完成程序设计。并计算出正确结果。 (2) 按照课程设计的报告的要求。完成课程设计报告。 5、时间按排 按本学期教务处课程设计时间表执行。(2016~2017第一学期)。13~16周.共16学时。 6、评分标准 平时成绩 20%,程序50%,课程设计报告 30%。 7、算法分析 第一步:建 立邻接表。 第二步:拓扑排序。 第三步:事件的最早发生时间。 第四步:事件的最晚发生时间。 第五步:求关键路径。 第六步:求活动的最 早、最晚发生时间。 第七步:计算关键路径并输出。 输出事件最早和最晚发生时间: 输出关键路径上的数据和总工期: 输出关键路径: 附计算结果:(以下内容要求在程序中输出) 要求输出邻接表和以下内容: 1、 所有事件的最早发生时间: Ve(1)=0 Ve(2)=5 Ve(3)=6 Ve(4)=max{ve(2)+3,ve(3)+6}=12 Ve(5)=max{ve(3)+3,ve(4)+3}=15 Ve(6)=ve(4)+4=16 Ve(7)=ve(5)+1=16 Ve(8)=ve(5)+4=19 Ve(9)=max{ve(8)+2,ve(7)+5}=21 Ve(10)=max{ve(6)+4,ve(9)+2}=23 2、 所有事件的最迟发生时间: Vl(10)=23 Vl(9)=vl(10)-2=21 Vl(8)=vl(9)-2=19 Vl(7)=vi(9)-5=16 Vl(6)=vl(10)-4=19 Vl(5)=min{vl(7)-1,vl(8)-4}=15 Vl(4)=min{vl(6)-4,vl(5)-3}=12 Vl(3)=min{vl(4)-6,vl(5)-3}=6 Vl(2)=vl(4)-3=9 Vl(1)=min{vl(2)-5,vl(3)-6}=0 3、 活动的最早开始时间、最迟开始时间、及最早、最迟之差。 最早 最迟 差 活动a1:e(1)=ve(1)=0 l(1)=vl(2)-5=4 d(1)=4 ​A2:e(2)=ve(1)=0 l(2)=vl(3)-6=0 d(2)=0 A3:e(3)=ve(2)=5 l(3)=vl(4)-3=9 d(3)=4 A4:e(4)=ve(3)=6 l(4)=vl(4)-6=6 d(4)=0 A5:e(5)=ve(3)=6 l(5)=vl(5)-3=12 d(5)=6 A6:e(6)=ve(4)=12 l(6)=vl(5)-3=12 d(6)=0 A7:e(7)=ve(4)=12 l(7)=vl(6)-4=15 d(7)=3 A8: e(8)=ve(5)=15 l(8) =vl(7)-1=15 d(8)=0 A9: e(9)=ve(5)=15 l(9)=vl(8)-4=15 d(9)=0 A10: e(10)=ve(7)=16 l(10)=vl(9)-5=16 d(10)=0 A11: e(11)=ve(8)=19 l(11)=vl(9)-2=19 d(11)=0 A12: e(12)=ve(6)=16 l(12)=vl(10)-4=19 d(12)=3 A13: e(13)=ve(9)=21 l(13)=vl(10)-2=21 d(13)=0 4、 此工程 要23天完成。 5、 关键活动:a2 ,a4 , a6, a8, a9, a10, a11, a13. 6、 关键路径:a2->a4->a6->a8->a10->a13 a2->a4->a6->a9->a11->a13 7、 若关键活动:a2,a4,a6,a13 加速完成,整个工程工期可以缩短。(选择关键活动加速后,计算总工期)

旅游管理系统小软件的bug求找一下

创建景点后,检测效果图 路径全替换为最大值,游客界面也无法查询线路,求指导一下谢谢 源代码 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define MaxSize 100 #define Max 32767 //////////////////////邻接表 typedef struct ArcNode { int adjvex; int info; ///////标志是否被访问过 int weight; struct ArcNode *nextarc; }ANode; typedef struct { int info; ///////标志是否被访问过 char name[50]; ANode *firstarc; }VNode, AdjList[MaxSize]; typedef struct { AdjList vertices; int vexnum, arcnum; }ALGraph; ////////////////////////邻接矩阵 typedef struct { int weight; int info; ///////0,表示无路径,1表示有路径 } AdjMatrix[MaxSize][MaxSize]; typedef struct { char names[MaxSize][50]; AdjMatrix arcs; int vexnum, arcnum; }MGrph; //////////////////////////////最短路径结点 typedef struct { int info; int weight; }MinW; ///////////////////////////拓扑排序用栈 typedef struct { VNode *Topo[MaxSize]; int top; }TP; //////////////////深度遍历生成树 typedef struct csnode { int num; struct csnode *firstchild, *nextsibling; }csnode, *cstree; int visited[MaxSize]; ////////////////////////函数部分 void Create(ALGraph *tu)//建立邻接链表 { int i; int shi, zhong, weight; ANode *p; printf("请输入景点数:"); scanf("%d", &tu->vexnum); printf("请输入道路数:"); scanf("%d", &tu->arcnum); for (i = 0; i<tu->vexnum; i++) { printf("请输入第个%d景点名:", i + 1); scanf("%s", tu->vertices[i].name); tu->vertices[i].firstarc = NULL; } for (i = 0; i<tu->arcnum; i++) { printf("请选择输入路径,形如(1 3)(从景点一到景点三):");//一条路径的起点和终点 scanf("%d%d", &shi, &zhong); printf("请输入该条路径的长度:"); scanf("%d", &weight); p = (ANode *)malloc(sizeof(ANode)); p->adjvex = zhong; p->weight = weight; p->nextarc = tu->vertices[shi].firstarc; tu->vertices[shi].firstarc = p; p = (ANode *)malloc(sizeof(ANode)); p->adjvex = shi; p->weight = weight; p->nextarc = tu->vertices[zhong].firstarc; tu->vertices[zhong].firstarc = p; } printf("创建完成!\n"); } void Rclear(MGrph *Ttu)//初始化邻接矩阵,(路径数与景点数已知)将矩阵路径长度初始化为Max,标志位初始化为0 { int i, j; for (i = 0; i<Ttu->vexnum; i++) for (j = 0; j<Ttu->vexnum; j++) { Ttu->arcs[i][j].weight = Max; Ttu->arcs[i][j].info = 0; } } void Turn(ALGraph *tu, MGrph *Ttu)//将邻接链表转换成邻接矩阵 { int i, j; ANode *p; Ttu->arcnum = tu->arcnum; Ttu->vexnum = tu->vexnum; Rclear(Ttu); for (i = 0; i<Ttu->vexnum; i++) strcpy(Ttu->names[i], tu->vertices[i].name); for (j = 0; j<tu->vexnum; j++) { p = tu->vertices[j].firstarc; while (p != NULL) { Ttu->arcs[j][p->adjvex].weight = p->weight; Ttu->arcs[j][p->adjvex].info = 1; p = p->nextarc; } } /* for(i=0;i<tu->vexnum;i++) { for(j=0;j<tu->vexnum;j++) printf("%d\t",Ttu->arcs[i][j].weight); printf("\n"); }*/ for (i = 0; i <= tu->vexnum; i++) { for (j = 0; j <= tu->vexnum; j++) { if (i == 0 && j == 0) { printf("\t"); } if (i == 0) { if (j != 0) { printf("景点%s\t", tu->vertices[j - 1].name); } } else { if (j == 0) { printf("景点%s\t", tu->vertices[i - 1].name); } else printf("%d\t", Ttu->arcs[i - 1][j - 1].weight); } }printf("\n"); } } void Rset(ALGraph *tu)//将邻接表中结点的标志以及边的标志初始化为0(路径数与景点数已知) { int i, j; ANode *p; for (i = 0; i<tu->vexnum; i++) tu->vertices[i].info = 0; for (j = 0; j<tu->vexnum; j++) { p = tu->vertices[j].firstarc; while (p != NULL) { p->info = 0; p = p->nextarc; } } } void Rbuild(ALGraph *tu)//景点规划(最小生成树) { int n, i, j, Min; ANode *p, *qin; MGrph GG; GG.arcnum = 0; GG.vexnum = 0; int min[MaxSize]; ALGraph *MinTree; MinTree = (ALGraph *)malloc(sizeof(ALGraph)); MinTree->vexnum = tu->vexnum; MinTree->arcnum = tu->vexnum - 1; Rset(tu); for (i = 0; i<tu->vexnum; i++) { min[i] = Max; strcpy(MinTree->vertices[i].name, tu->vertices[i].name); MinTree->vertices[i].firstarc = NULL; } printf("请选择做为入口的景点标号(1— %d):", tu->vexnum); scanf("%d", &n); for (i = 0; i<tu->vexnum; i++) { tu->vertices[n - 1].info = 1; Min = Max; p = tu->vertices[n - 1].firstarc; while (p != NULL) { if (min[p->adjvex]>p->weight) { min[p->adjvex] = p->weight; qin = (ANode *)malloc(sizeof(ANode)); qin->adjvex = n - 1; qin->weight = p->weight; qin->nextarc = NULL; MinTree->vertices[p->adjvex].firstarc = qin; } p = p->nextarc; } for (j = 0; j<tu->vexnum; j++) if (Min>min[j] && (tu->vertices[j].info != 1)) { Min = min[j]; n = j + 1; } } Turn(MinTree, &GG); } void DFSTree(ALGraph *tu, int v, cstree &T) { int first, w = -1; ANode *d; d = NULL; cstree p, q; visited[v] = 1; first = 1; T->num = v; if (tu->vertices[v].firstarc) d = tu->vertices[v].firstarc; for (; d; d = d->nextarc) { w = d->adjvex; if (!visited[w]) { p = (cstree)malloc(sizeof(csnode)); p->num = w; p->firstchild = NULL; p->nextsibling = NULL; if (first) { T->firstchild = p; first = 0; } else q->nextsibling = p; q = p; DFSTree(tu, w, q); } } } int Gshow(cstree T, int &f) { if (T) { printf("%d\n", T->num); if (T->nextsibling) { printf("有回路,下面进入人工选择!"); f = 1; return 0; } else if (T->firstchild) Gshow(T->firstchild, f); } return 1; } void minway(MGrph *Ttu) { MinW min[MaxSize]; int flags[MaxSize]; int i, mi, n, j, pre; printf("请输入您当前所在景点位置标号:\n"); scanf("%d", &n); for (i = 0; i<Ttu->vexnum; i++) { flags[i] = 0; min[i].info = n; min[i].weight = Ttu->arcs[n][i].weight; } flags[n] = 1; int k = n; for (i = 1; i<Ttu->vexnum; i++) { mi = Max; for (j = 0; j<Ttu->vexnum; j++) if (flags[j] == 0 && mi>min[j].weight) { mi = min[j].weight; pre = j; } min[pre].info = k; flags[pre] = 1; k = pre; for (j = 0; j<Ttu->vexnum; j++) if (flags[j] == 0 && (min[pre].weight + Ttu->arcs[pre][j].weight<min[j].weight)) { min[j].weight = min[pre].weight + Ttu->arcs[pre][j].weight; min[j].info = pre; } } printf("请输入目标位置:\n"); scanf("%d", &n); printf("您距离目标%d,您将由%d位置走向目标。\n", min[n].weight, min[n].info); } void Guide(ALGraph *tu, MGrph *Ttu) { int n; int f = 0; cstree T; T = (cstree)malloc(sizeof(csnode)); T->firstchild = NULL; T->nextsibling = NULL; Rset(tu); printf("请选择您所在景点(1 — %d):", tu->vexnum); scanf("%d", &n); DFSTree(tu, n - 1, T); Gshow(T, f); if (f == 1) minway(Ttu); } void main() { ALGraph G; MGrph TG; int f = 0; int key = 0; int ch; G.arcnum = 0; G.vexnum = 0; TG.arcnum = 0; TG.vexnum = 0; while (key != 3) { f = 0; printf("→→→欢迎进入旅游管理系统\n"); printf(" ↓↓↓ 请确认身份\n"); printf("1 → 管理员\n"); printf("2 → 游客\n"); printf("3 → 退出\n"); scanf("%d", &key); if (key>3 || key<1) { printf("错误选项!\n"); continue; } while (f == 0 && key == 1) { printf(" 管理系统为您服务!\n"); printf(" ☆ 请选择(1-4):\n"); printf("1 创建景点分布图\n"); printf("2 检测创建效果图\n"); printf("3 最低造价路线图\n"); printf("4 退出→管理系统\n"); scanf("%d", &ch); switch (ch) { case 1:Create(&G); break; case 2:Turn(&G, &TG); break; case 3:Rbuild(&G); break; case 4:f = 1; break; default:printf("错误选项!请重新选择!\n"); break; } } while (f == 0 && key == 2) { printf("机器人乐乐为您服务:\n"); printf(" ^ ^\n"); printf("1线路 0 0 导游\n"); printf(" 6\n"); printf("2捷径 + + 引领\n"); printf("3→退出导游系统\n"); scanf("%d", &ch); switch (ch) { case 1:Guide(&G, &TG); break; case 2:minway(&TG); break; case 3:f = 1; break; default:printf("错误选项!请重新选择!\n"); break; } } } } ```

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

Linux面试题(2020最新版)

文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别?Linux 使用的进程间通信方式?Linux 有哪些系统日志文件?Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什...

Linux命令学习神器!命令看不懂直接给你解释!

大家都知道,Linux 系统有非常多的命令,而且每个命令又有非常多的用法,想要全部记住所有命令的所有用法,恐怕是一件不可能完成的任务。 一般情况下,我们学习一个命令时,要么直接百度去搜索它的用法,要么就直接用 man 命令去查看守冗长的帮助手册。这两个都可以实现我们的目标,但有没有更简便的方式呢? 答案是必须有的!今天给大家推荐一款有趣而实用学习神器 — kmdr,让你解锁 Linux 学习新姿势...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

史上最全的 python 基础知识汇总篇,没有比这再全面的了,建议收藏

网友们有福了,小编终于把基础篇的内容全部涉略了一遍,这是一篇关于基础知识的汇总的文章,请朋友们收下,不用客气,不过文章篇幅肯能会有点长,耐心阅读吧爬虫(七十)多进程multiproces...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

85后蒋凡:28岁实现财务自由、34岁成为阿里万亿电商帝国双掌门,他的人生底层逻辑是什么?...

蒋凡是何许人也? 2017年12月27日,在入职4年时间里,蒋凡开挂般坐上了淘宝总裁位置。 为此,时任阿里CEO张勇在任命书中力赞: 蒋凡加入阿里,始终保持创业者的冲劲,有敏锐的...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

新一代神器STM32CubeMonitor介绍、下载、安装和使用教程

关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang最近ST官网悄悄新上线了一款比较强大的工具:STM32CubeMonitor V1.0.0。经过我研究和使用之...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

大学一路走来,学习互联网全靠这几个网站,最终拿下了一把offer

大佬原来都是这样炼成的

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

什么时候跳槽,为什么离职,你想好了么?

都是出来打工的,多为自己着想

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

立即提问
相关内容推荐