有关的拓扑排序问题·

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

1个回答

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
为什么拓扑排序算法不适合无向图的拓扑排序
为什么拓扑排序算法不适合无向图的拓扑排序 为什么拓扑排序算法不适合无向图的拓扑排序 为什么拓扑排序算法不适合无向图的拓扑排序
数据结构求解:如何列出所有的拓扑排序
数据结构求解:如何才能输出所有的拓扑排序,可以说下思路吗,最好可以给段代码理解。
拓扑排序(c++)不太懂,有没有大神,求教
最近要写拓扑排序的程序,然后作为一名渣渣,并不是特别懂。课本上说的只说了大致的,我只知道它的思想,却写不出程序来。有没有大神愿意教我(*´ο`*)
求解,输出所有拓扑排序的思路
数据结构问题求解,求如何输出所有拓扑排序的思路,最好附上代码
跪求有向无环图所有可能的拓扑排序结果。感谢。
谢谢大家回答,LZ只会写一种排序,我设计的存储结构是邻接链表
求这个图的拓扑排序的序列
![图片说明](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出栈,也就无法得出上述序列。 求各位解答。
判断有向图中在环中的顶点
在判断有向图中在一个环内的顶点时,我先递归删掉将入度为零的点和对应出度边(类似于拓扑排序),然后剩下的顶点中再去掉出度为零的顶点,那么最后剩下是不是一定在环里(假定只有一个环)?(纯新人求教)
新手求助,数据结构课设的源程序,麻烦大佬们看下注释一下,搞不懂啥意思?
_#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); } } } ``` ```
用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; }` ```
程序错误求修改!!!!
请问下面代码段中有向图邻接表的建立错在哪了??求帮助!!!! #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); }
数据结构课程设计求各位大神帮忙要代码就好
《数据结构》课程设计指导意见 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 加速完成,整个工程工期可以缩短。(选择关键活动加速后,计算总工期)
自己初始化邻接表数据有问题 (注视是瞎写的)如果还有其他问题也请帮忙改一下
#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; }
旅游管理系统小软件的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岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
【JSON解析】浅谈JSONObject的使用
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
立即提问