• 单源最短路(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 */
     
  • 相关阅读:
    巡风安装笔记
    泛微ecology OA系统某接口存在数据库配置信息泄露漏洞
    Apache Solr Velocity模板远程代码执行复现
    泛微OA系统多版本存在命令执行漏洞
    各种浏览器UA值
    使用python合并excel
    疑难杂症----udf提权无法导出.dll
    疑难杂症----windows7
    Nmap的使用
    Sqlmap的使用
  • 原文地址:https://www.cnblogs.com/frankying/p/6581967.html
Copyright © 2020-2023  润新知