代码随想录Day58|拓扑排序精讲、dijkstra(朴素版)精讲
目录
- 拓扑排序精讲
- 解题思路
- 解法
- dijkstra(朴素版)精讲
- 解题思路
- 解法
- 今日总结
拓扑排序精讲
题目链接:KamaCoder
文章讲解:代码随想录
视频讲解:bilibili
解题思路
拓扑排序,只需要找到一个合理的顺序即可,如果存在闭合环路,那么将不存在有效的拓扑排序,因为彼此相互依赖,确定不了先后关系。这里确定当前点没有依赖的方式是判断当前节点是否入度为0,如果入度为零,说明当前点的前序操作都已经完成,可以被执行。而每处理一个节点,就将该节点指向的点的入度更新,指明下一个点的该前序操作完成。这种遍历方式适合用广度优先搜索进行解决。最后结果数组中如果点数与总点数不同,则说明存在环路,不存在有效的拓扑排序。
解法
#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>using namespace std;int main(){int n, m;cin >> n >> m;vector<int> inDegree(n, 0);unordered_map<int, vector<int>> umap;for(int i=0; i<m; i++){int s, t;cin >> s >> t;inDegree[t]++;umap[s].push_back(t);}vector<int> res;queue<int> que;for(int i=0; i<n; i++){if(inDegree[i]==0){que.push(i);}}while(!que.empty()){int cur = que.front();que.pop();res.push_back(cur);if(umap[cur].size()){for(int t : umap[cur]){inDegree[t]--;if(inDegree[t]==0){que.push(t);}}}}if(res.size()==n){for(int i=0; i<n-1; i++){cout << res[i] << " ";}cout << res[n-1] << endl;} else {cout << -1 << endl;}return 0;}
- 时间复杂度:O(nk)O(nk)O(nk)
- 空间复杂度:O(nk)O(nk)O(nk)
dijkstra(朴素版)精讲
题目链接:KamaCoder
文章讲解:代码随想录
视频讲解:bilibili
解题思路
和prim算法很像,都是对于点进行贪心操作,不同的是,prim是得到一个权值之和最小的生成树,而dijkstra则是得到源点到终点的最小距离,而且是有向的,相比于prim的双向节点关系更加严格,这也是为什么dijkstra不能处理权值为负的边,而prim可以。
解法
#include <iostream>
#include <vector>
#include <climits>using namespace std;int main(){int n, m;cin >> n >> m;vector<vector<int>> grid(n+1, vector<int>(n+1, INT_MAX));for(int i=1; i<=m; i++){int s, t, val;cin >> s >> t >> val;grid[s][t] = val;}int start = 1; int end = n;vector<int> minDis(n+1, INT_MAX);vector<bool> visited(n+1, false);minDis[start] = 0;for(int i=1; i<=n; i++){int minVal = INT_MAX;int cur = 1;for(int v=1; v<=n; v++){if(!visited[v] && minDis[v] < minVal){minVal = minDis[v];cur = v;}}visited[cur] = true;for(int v=1; v<=n; v++){if(!visited[v] && grid[cur][v] != INT_MAX && grid[cur][v] + minDis[cur] < minDis[v]){minDis[v] = grid[cur][v] + minDis[cur]; }}}if(minDis[end]==INT_MAX){cout << -1 << endl;} else{cout << minDis[n] << endl;}return 0;
}
- 时间复杂度:O(n2)O(n^2)O(n2)
- 空间复杂度:O(n2)O(n^2)O(n2)
今日总结
补卡中()
