Dijkstra

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. using namespace std;
  7. const int INF=2e9;
  8. const int maxn=1e4+5;
  9. const int MAXN=100+5;
  10. int Distance[MAXN];
  11. bool Visited[MAXN];
  12. int Start,End,edgeN;
  13. int tot=0,curr;
  14. int Head[MAXN];
  15. struct Edge{
  16. int to;
  17. int w;
  18. int Next;
  19. }edge[maxn];
  20. struct Node{
  21. int id,d;
  22. bool operator<(const Node &a)const{
  23. return a.d<d;
  24. }
  25. }node;
  26. priority_queue<Node> que;
  27. void addEdge(int x,int y,int z){
  28. tot++;
  29. edge[tot].to=y;
  30. edge[tot].w=z;
  31. edge[tot].Next=Head[x];
  32. Head[x]=tot;
  33. }
  34. void init(){
  35. memset(Visited,0,sizeof(Visited));
  36. for(int i=0;i<MAXN;i++) Distance[i]=INF;
  37. scanf("%d%d%d",&Start,&End,&edgeN);
  38. for(int i=0,x,y,z;i<edgeN;i++){
  39. scanf("%d%d%d",&x,&y,&z);
  40. addEdge(x,y,z);
  41. }
  42. }
  43. void dijkstra(){
  44. curr=Start; Distance[curr]=0;
  45. node.id=curr; node.d=0; que.push(node);
  46. while(!que.empty()){
  47. curr=que.top().id; que.pop();
  48. if(Visited[curr]) continue;
  49. Visited[curr]=true;
  50. if(Visited[End]) break;
  51. for(int i=Head[curr];i;i=edge[i].Next){
  52. if(!Visited[edge[i].to]&&Distance[edge[i].to]>Distance[curr]+edge[i].w){
  53. Distance[edge[i].to]=Distance[curr]+edge[i].w;
  54. node.id=edge[i].to; node.d=Distance[edge[i].to]; que.push(node);
  55. }
  56. }
  57. }
  58. printf("%d\n",Distance[End]);
  59. }
  60. int main(){
  61. init();
  62. dijkstra();
  63. return 0;
  64. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值