Bellman-Ford算法
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int n, int k) {
vector<int> dist(n+1, 1e9);
dist[k]=0;
vector<int> from(n+1, -1);
for(int round=1; round<n; ++round){
bool flag=false;
for(auto & time:times){
int x=time[0];
int y=time[1];
int z=time[2];
if(dist[x]+z<dist[y]){
dist[y] = dist[x]+z;
from[y] = x;
flag=true;
}
}
if(!flag) break;
}
int res=0;
int intFrom;
for(int i=1;i<=n; ++i){
if(dist[i]>res){
res = dist[i];
intFrom = i;
}
}
cout<<intFrom<<endl;
while(from[intFrom]!=-1){
intFrom=from[intFrom];
cout<<intFrom<<endl;
}
return res==1e9? -1:res;
}
};
Dijkstra算法
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int n, int k) {
vector<vector<int>> vertexs(n+1);
vector<vector<int>> edges(n+1);
for(auto& time:times){
int x = time[0];
int y = time[1];
int z = time[2];
vertexs[x].push_back(y);
edges[x].push_back(z);
}
priority_queue<pair<int, int>> q;
vector<bool> visited(n+1, false);
vector<int> dist(n+1, 1e9);
vector<int> path(n+1, -1);
dist[k]=0;
q.push(make_pair(-dist[k], k));
while(!q.empty()){
int x = q.top().second;
q.pop();
if(visited[x]) continue;
visited[x]=true;
for(int i=0;i<vertexs[x].size(); ++i){
int y=vertexs[x][i];
int z=edges[x][i];
if(dist[x]+z<dist[y]){
dist[y] = dist[x]+z;
path[y] = x;
q.push(make_pair(-dist[y], y));
}
}
}
int res=0;
int end = 1;
cout<<"末节点:"<<end<<endl;
while(path[end]!=-1){
end=path[end];
cout<<end<<endl;
}
for(int i=1; i<dist.size(); ++i) res = max(res, dist[i]);
return res==1e9? -1:res;
}
};
743网络延长时间