booltoposort(){ int num = 0; // 记录加入拓扑序列的顶点数 queue<int> q; for (int i = 0; i < n; i++) if (inDegree[i] == 0) q.push(i); // 将入度为0的顶点入队 while (!q.empty()) { int u = q.front(); // 取出队首元素 q.pop(); // 队首元素出队 for (int i = 0; i < G[u].size(); i++) { int v = G[u][i]; // u的后继v inDegree[v]--; // v的入度减1 if (inDegree[v] == 0) q.push(v); // 入度为0则入队 } num++; // 加入拓扑排序 } return num == n; }
朴素 dijkstra 算法
时间复杂度 O(n2+m), n 表示点数,m 表示边数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
int n, G[1000][1000]; int d[1000]; // 起点到各点的距离 bool vis[1000] = {false}; constint INF = 0x3fffffff;
voidDijlstra(int s){ // s为起点 fill(d, d + 1000, INF); d[s] = 0; // 起点到自身的距离为0 for (int i = 0; i < n; i++) { // 循环n次 int u = -1; // 寻找距离最小的点 for (int j = 0; j < n; j++) { if (vis[j] == false && (u == -1 || d[u] > d[j])) u = j; } vis[u] = true; for (int v = 0; v < n; v++) d[v] = min(d[v], d[u] + G[u][v]); // 以u为中介点 } }
int n, m; // n 表示点数,m 表示边数 int father[1000]; constint INF = 0x3fffffff; structedge { int u, v; // 边序号 int cost; // 边权 } E[1000]; boolcmp(edge a, edge b){ return a.cost < b.cost; } intfindFather(int x){ // 并查集核心操作 if (father[x] != x) father[x] = findFather(father[x]); return father[x]; }
intKruskal(){ int ans = 0, num = 0; // ans为边权和,num为生成树边数 for (int i = 0; i < n; i++) father[i] = i; // 并查集初始化 sort(E, E + m, cmp); // 按边权从小到大排序 for (int i = 0; i < m; i++) { //枚举所有边 int u = findFather(E[i].u); int v = findFather(E[i].v); if (u != v) { //如果不在一个集合 father[u] = v; //合并 ans += E[i].cost; num++; if (num == n - 1) break; } } if (num != n - 1) return-1; return ans; }
int n; // n表示点数 vector<vector<int>> G; // 邻接表 int color[n]; // 表示每个点的颜色,-1表示未染色,0表示白色,1表示黑色 booldfs(int u, int c){ // u表示当前节点,c表示当前点的颜色 color[u] = c; // 遍历u的邻接节点 for (int i = 0; i < G[u].size(); i++) { int v = G[u][i]; // 如果相邻节点未染色 if (color[v] == -1) { // 将相邻的点染成相反的颜色 if (!dfs(v, !c)) returnfalse; } elseif (color[v] == c) //结点v已经着色,且和结点u颜色冲突 returnfalse; } returntrue; } boolcheck(){ memset(color, -1, sizeof(color)); bool flag = true; for (int i = 0; i < n; i++) // 如果当前节点未染色 if (color[i] == -1) if (!dfs(i, 0)) { flag = false; break; } return flag; }