有关的拓扑排序问题·

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只会写一种排序,我设计的存储结构是邻接链表

如何查找无向图两个节点间的所有路径

看到有用深度优先遍历+递归的方法实现的,但当图比较大时递归效率很低,还能有什么方法可以快一点的,最好能有java程序实现参考

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

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

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

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

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

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

R语言作网络图的一些问题

我用R语言的igraph包作网络图,对于孤立点,系统默认将它和为‘NA’的点连起来。 我希望的是孤立点没有任何连线,应该怎样做呢?在文档中没能找到相应的做法。 另外,我用fgui做了个界面,希望把生成的图显示在自己界面上,应该怎样做。 谢谢大家!!

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

_#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); } } } ``` ```

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

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

有向无环图最长路径,自己运行可以,提交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岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

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

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

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

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

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

为什么本科以上学历的人只占中国人口的5%,但感觉遍地都是大学生?

中国大学生占总人口不到5% 2017年,中国整体的本科率仅有5.9%;如果算上研究生,这一比例可以进一步上升到6.5% 为什么在国家统计局推出的这份年鉴中,学历的最高一阶就是到研究生,而没有进一步再统计博士生的数量的。 原因其实并不难理解,相比全国和各省整体人口体量,博士生的占比非常之低,属于绝对意义上的小概率样本。 这一点,我们从上表中的各省研究生占比情况也可以看出端倪。除北京、天津、上海三...

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

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

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

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

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

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

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

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

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

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

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

记录下入职中软一个月(外包华为)

我在年前从上一家公司离职,没想到过年期间疫情爆发,我也被困在家里,在家呆着的日子让人很焦躁,于是我疯狂的投简历,看面试题,希望可以进大公司去看看。 我也有幸面试了我觉得还挺大的公司的(虽然不是bat之类的大厂,但是作为一名二本计算机专业刚毕业的大学生bat那些大厂我连投简历的勇气都没有),最后选择了中软,我知道这是一家外包公司,待遇各方面甚至不如我的上一家公司,但是对我而言这可是外包华为,能...

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

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

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

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

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

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

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

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

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

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

6年开发经验女程序员,面试京东Java岗要求薪资28K

写在开头: 上周面试了一位女程序员,上午10::30来我们部门面试,2B哥接待了她.来看看她的简历: 个人简历 个人技能: ● 熟悉spring mvc 、spring、mybatis 等框架 ● 熟悉 redis 、rocketmq、dubbo、zookeeper、netty 、nginx、tomcat、mysql。 ● 阅读过juc 中的线程池、锁的源...

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

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

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

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

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

立即提问
相关内容推荐