单源最短路(spfa+Dijkstra)附数据

choose表示选择的算法~

题目戳我~

  1 #include <cstdio>
  2 #include <cstring>
  3 
  4 #define INF 2147483647
  5 #define N 1000001
  6 
  7 long long n,m,f,nxt[N],fst[N],v[N],e[N],cnt = 0,dis[N],queue[N];
  8 
  9 int t,w;bool inqueue[N] = {0};  //Dijkstra
 10 
 11 bool book[1000001] = {0};        //spfa
 12 
 13 void Add(int a,int b,int c){
 14     cnt++;
 15     if(a == f)dis[b] = c;
 16     e[cnt] = b;
 17     nxt[cnt] = fst[a];
 18     fst[a] = cnt;
 19     v[cnt] = c;
 20 }
 21 int main()
 22 {
 23     memset(fst,-1,sizeof(fst));
 24     memset(nxt,-1,sizeof(nxt));
 25     scanf("%lld %lld %lld",&n,&m,&f);
 26     for(int i = 0;i <= n + 10;i++)
 27         dis[i] = INF;
 28     for(int i = 1;i <= m;i++){
 29         long long a,b,c;
 30         scanf("%lld %lld %lld",&a,&b,&c);
 31         Add(a,b,c);
 32     }
 33     
 34     int choose = 2;
 35     
 36     if(choose == 1){
 37         //Dijkstra
 38         dis[f] = 0;
 39         book[f] = 0;
 40         for(int i = 1;i <= n;i++){
 41             int Mn = INF,x;
 42             for(int j = 1;j <= n;j++)
 43                 if(dis[j] < Mn && !book[j])
 44                     Mn = dis[j],x = j;
 45             book[x] = 1;
 46             for(int k = fst[x];k != -1;k = nxt[k])
 47                 if(v[k] + dis[x] < dis[e[k]])
 48                     dis[e[k]] = v[k] + dis[x]; 
 49         }
 50     }
 51     if(choose == 2){
 52         //spfa
 53         memset(inqueue,0,sizeof(inqueue));
 54         t = w = 1;
 55         queue[1] = f;
 56         inqueue[f] = 1;
 57         dis[f] = 0;
 58         while(t <= w){ 
 59             inqueue[queue[t]] = 0;
 60             for(int j = fst[queue[t]];j != -1;j = nxt[j]){
 61                 if(dis[queue[t]] + v[j] <= dis[e[j]]/*一定为"<="*/){
 62                     dis[e[j]] = dis[queue[t]] + v[j];
 63                     if(!inqueue[e[j]]){
 64                         w++;
 65                         queue[w] = e[j];
 66                         inqueue[e[j]] = 1;
 67                     }
 68                 }            
 69             }
 70             t++;
 71         }
 72     }
 73     
 74     for(int i = 1;i <= n;i++){
 75         //printf("%lld %c %lld : %lld\n",f,26,i,dis[i]);
 76         printf("%d ",dis[i]);
 77     }
 78         
 79     return 0;
 80 }
 81 /*
 82 ---data---
 83 
 84 4 5 1
 85 1 4 9
 86 2 4 6
 87 1 2 5
 88 4 3 8
 89 1 3 7
 90 ans:
 91 0 5 7 9
 92 
 93 4 6 1
 94 1 2 2
 95 2 3 2
 96 2 4 1
 97 1 3 5
 98 3 4 3
 99 1 4 4
100 ans:
101 0 2 4 3
102 
103 6 9 1
104 1 2 1
105 1 3 12
106 2 3 9
107 2 4 3
108 3 5 5
109 4 3 4
110 4 5 13
111 4 6 15
112 5 6 4
113 ans:
114 0 1 8 4 13 17
115 */
 

 

转载于:https://www.cnblogs.com/frankying/p/6581967.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值