学习资料:代码随想录
拓扑排序精讲
要先处理被依赖的文件。两步曲:找到入度为0的节点,加入结果;删除入度为0的节点(具体操作为将其通向的节点的入度数减一,从而可以判断删除之后的节点了)
整个过程使用广度优先搜索完成,毕竟每一次要记录该节点通向的所有节点,与广度优先搜索非常契合
cpp
#include <iostream>
#include <unordered_map>
#include <vector>
#include <queue>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
unordered_map<int,vector<int>> umap;
int s,t;
vector<int> inDegrees(n,0);
for(int i=0;i<m;i++){
cin>>s>>t;
inDegrees[t]++;
umap[s].push_back(t); //记录s指向的文件
}
queue<int> que;
for(int i=0;i<n;i++){
if(inDegrees[i]==0){
que.push(i);
}
}
vector<int> result;
while(!que.empty()){
int cur = que.front();
que.pop();
result.push_back(cur);
vector<int> files = umap[cur];
if(files.size()){
for(int i=0;i<files.size();i++){
inDegrees[files[i]]--;
if(inDegrees[files[i]]==0){
que.push(files[i]);
}
}
}
}
if(result.size()==n){
for(int i=0;i<n-1;i++){
cout<<result[i]<<' '; //正好被依赖的在result的最前边
}
cout<<result[n-1];
}
else{ //有环的情况(result.size() < n)在这里处理了
cout<<-1;
}
return 0;
}
/**************************************************************
Problem: 1191
User: odCYZ6hD6fu5mJce4N09fTNWuOjA [kamaCoder25388]
Language: C++
Result: 正确
Time:53 ms
Memory:2184 kb
****************************************************************/
dijkstra(朴素版)精讲
相对于prim算法 minDist表示 节点到最小生成树的最小距离,dijksta算法minDist表示 节点到源点的最小距离
还是要看一下模拟过程,感觉贪心有一个特别精妙的点在于,直觉上感觉是每一次都选择最短路径可能会错过其他路径,但代码实现起来其实是都考虑到了
cpp
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main(){
int n,m,s,e,v;
cin>>n>>m;
vector<vector<int>> traffic(n+1,vector<int>(n+1,INT_MAX));
for(int i=0;i<m;i++){
cin>>s>>e>>v;
traffic[s][e]=v;
}
vector<int> minDis(n+1,INT_MAX);
vector<bool> visited(n+1,false);
//初始化
int start=1;
int end = n;
minDis[start]=0;
for(int i=0;i<n;i++){ //这里可视为操作n次,每一轮从所有还没访问过的点中,挑一个到起点距离最短的点,然后用它更新它的邻居
int cur = 1;
int minVal = INT_MAX;
//选距离源最近且未被访问过的节点,后面mindis数组的每一次更新都是基于新加的站,都是该站能确定跑到的站
for(int j=1;j<=n;j++){
if(!visited[j]&&minDis[j]<minVal){
cur=j;
minVal=minDis[j];
}
}
visited[cur]=true;
//更新各未记录的站点到始发站的距离
for(int k=1;k<=n;k++){
if(!visited[k]&&traffic[cur][k]!=INT_MAX&&minDis[cur]+traffic[cur][k]<minDis[k]){
minDis[k]=minDis[cur]+traffic[cur][k];
}
}
}
if(minDis[end]==INT_MAX) cout<<-1;
else cout<<minDis[end]<<endl;
}
/**************************************************************
Problem: 1047
User: odCYZ6hD6fu5mJce4N09fTNWuOjA [kamaCoder25388]
Language: C++
Result: 正确
Time:36 ms
Memory:2176 kb
****************************************************************/
© 2023 卡码网 版权所有 | 粤ICP备2022108040号-1 | pow