迪杰斯特算法

#include<cstdio> #include<algorithm> #include<iostream> #include<queue> using namespace std; const int maxn = 505; const int INF = 99999; struct node { int length; int price; }trl[maxn][maxn]; bool is[maxn] = {0}; queue<int> q; int dis[maxn]; int money[maxn]; int path[maxn]; void Dijkstra(int str,int n) { for(int i = 0;i<n;i++) { dis[i] = INF; money[i] = INF; if(i == str) { dis[i] = 0; money[i] = 0; } path[i] = -1; } q.push(str); int cur = str; while(!q.empty()) { cur = q.front(); is[cur] = true; q.pop(); for(int i = 0;i<n;i++) { if(trl[cur][i].length!=-1&&!is[i]&&dis[i]>dis[cur]+trl[cur][i].length) { q.push(i); dis[i] = dis[cur]+trl[cur][i].length; money[i] = money[cur]+trl[cur][i].price; path[i] = cur; } else if(dis[i] == trl[cur][i].length+dis[cur] && money[i]>money[cur]+trl[cur][i].price) { dis[i] = trl[cur][i].length+dis[cur]; money[i] = money[cur]+trl[cur][i].price; path[i] = cur; } } } } int main(void) { int n,m,s,d; cin >> n >> m >> s >> d; for(int i = 0;i<n;i++) { for(int j = 0;j<n;j++) { if(i == j) { trl[i][j].length = 0; trl[i][j].price = 0; } else { trl[i][j].length = -1; trl[i][j].price = -1; } } } for(int i = 1;i<=m;i++) { int a,b,c,d; cin >> a >> b >> c >> d; trl[a][b].length = c; trl[a][b].price = d; trl[b][a].length = c; trl[b][a].price = d; } Dijkstra(s,n); cout << dis[d] << " " << money[d]; return 0; }
计算机小白记录学习过程,喜欢就点个推荐和关注吧O(∩_∩)O哈哈~

浙公网安备 33010602011771号