1、写了模板类,模板函数的定义需要写在.h文件中。
2、一个bool类型是1字节,然后都是用指针来声明数组大小,所以memset(exit, false, (sizeof exit)),错误,因为sizeof指针得到的是4,不是数组的大小,然后我memset(exit, false, (sizeof exit) * maxn),越界,因为4*maxn错了,bool数组大小是1。所以解决办法是,
sizeof(bool) * maxn || sizeof(exit[0]) * maxn(最好这样)
3、关键路径算法,最终都是对于每一个活动(每一条边)而言的。
①、ES,最早开始时间,对于顶点而言,那么一个拓扑排序后取max即可。表示这个顶点可以开始了,前导工作已经做完。边界是ES[0] = 0
②、LF,最晚完成时间,对于顶点而言,应该是,反向拓扑,反向拓扑可以记录拓扑序列,然后先进后出。然后对于每个顶点的出边,取那个MIN(ES[v] - e[j].w),也就是要留很多时间做那个耗时最大的项目。边界是LF[n] = ES[n](其他的不是)
有了前面两个,就可以求出下面的了,下面的可以对于每一条边来说
③、EF,最早完成时间,EF<u, v> = ES[u] + w[u][v];
④、LS,最晚开始时间,LS<u, v> = LF[v] - w[u][v];
另外:ES<u, v> = ES[u],LF<u, v> = LF[v],这个活动最晚完成是,下一个节点最晚完成,它也肯定要完成。(节点也完成不完成的概念,只是一个状态)
缓冲时间,SL<u, v> = LS<u, v> - ES<u, v> = LF<i, j> - EF<i, j>
缓冲时间为0的即为关键路径
4、如果使用CodeBlock,新建的.cpp文件需要拥有debug和relase功能
5、如果没用using namespace std;那么用endl的时候,要需要std::endl
#pragma once //#ifndef info.h //#define info.h #include <algorithm> #include <queue> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <stack> #include <set> #include <iomanip> using namespace std; namespace liuWeiMing { template<typename T, const int MAX_NODE_SIZE = 10000, const int MAX_EDGE_SIZE = 50000> //默认最大100000个节点 class Graph { private: struct Edge { int u, v, tonext; T w; char name; } *e; int num, *first, *tim; bool *exit, *in; T *dis; pair<T, bool> getMinDistance_SPFA(int from, int to); public: Graph() { e = new Edge[MAX_EDGE_SIZE]; first = new int[MAX_NODE_SIZE]; exit = new bool[MAX_NODE_SIZE]; dis = new T[MAX_NODE_SIZE]; tim = new int[MAX_NODE_SIZE]; in = new bool[MAX_NODE_SIZE]; //memset(exit, false, sizeof exit); //memset(first, -1, sizeof first); //指针不能直接sizeof memset(exit, false, sizeof(exit[0]) * MAX_NODE_SIZE); //不能 * sizeof(bool *) = 4,指针大小就是4 memset(first, -1, (sizeof (first[0])) * MAX_NODE_SIZE); num = 0; } ~Graph() { printf("本次使用完毕 "); //内敛函数,写少一点,建议放在同一行 delete[] e; delete[] first; delete[] exit; delete[] dis; delete[] tim; delete[] in; } bool addNode(int u); bool delNode(int u); bool addEdge(int u, int v, T w, char name = '