zoukankan      html  css  js  c++  java
  • 最短路径

    继续屯代码

    floyed

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<cstring>
     4 double map[101][101],x[101],y[101];
     5 int n,m,u,v;
     6 double dis(int u,int v){
     7     return (sqrt((x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v])));
     8 }
     9 
    10 
    11 int main(){
    12     scanf("%d",&n);
    13     for (int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
    14     scanf("%d",&m);
    15     for (int i=0;i<=n;i++) for (int j=0;j<=n;j++) map[i][j]=100000;
    16     for (int i=0;i<m;i++){
    17         scanf("%d%d",&u,&v);
    18         map[u][v]=dis(u,v);
    19         map[v][u]=map[u][v];
    20     }
    21     for (int k=1;k<=n;k++)
    22         for (int i=1;i<=n;i++)
    23             for (int j=1;j<=n;j++) if (map[i][k]+map[k][j]<map[i][j]) map[i][j]=map[i][k]+map[k][j];
    24     scanf("%d%d",&u,&v);
    25     printf("%.2lf",map[u][v]);
    26 }

    迪杰斯塔拉

     1 #include<cstring>
     2 #include<cstdio>
     3 #include<vector>
     4 using namespace std;
     5 const int MAXN=10000;
     6 vector<int> W[MAXN],E[MAXN];
     7 int dis[MAXN],ans=0,n,m,map[MAXN][MAXN];
     8 bool vis[MAXN]={0};
     9 void add(int u,int v,int w1){
    10     E[u].push_back(v);
    11     W[u].push_back(w1);
    12 }
    13 
    14 void dij(){
    15     memset(dis,127,sizeof(dis));
    16     dis[1]=0;
    17     for (int i=0;i<n;i++){
    18         int min=100000,minn;
    19         for (int j=1;j<=n;j++){
    20             if (dis[j]<min&&!vis[j]){
    21                 min=dis[j];
    22                 minn=j;
    23             }
    24         }
    25         vis[minn]=1;
    26         ans+=min;
    27         for (int j=0;j<E[minn].size();j++){
    28             if (W[minn][j]+dis[minn]<dis[E[minn][j]]){
    29                 dis[E[minn][j]]=W[minn][j]+dis[minn];
    30             }    
    31         }
    32     }
    33 }
    34 
    35 
    36 int main(){
    37     scanf("%d",&n);
    38     int u,v,w1;
    39     for (int i=1;i<=n;i++){
    40         for (int j=1;j<=n;j++) scanf("%d",&map[i][j]);
    41     }
    42 
    43     for (int i=1;i<=n;i++)
    44         for (int j=1;j<i;j++) {
    45             add(j,i,map[i][j]);
    46             add(i,j,map[i][j]);
    47         }
    48     dij();
    49     printf("%d",dis[n]);
    50 }

    优先队列优化后

     1 #include<cstring>
     2 #include<cstdio>
     3 #include<vector>
     4 #include<functional>
     5 #include<queue>
     6 using namespace std;
     7 const int MAXN=10000;
     8 vector<int> W[MAXN],E[MAXN];
     9 int dis[MAXN],ans=0,n,m,map[MAXN][MAXN];
    10 bool vis[MAXN]={0};
    11 struct dott{int num,v;
    12 };
    13 void add(int u,int v,int w1){
    14     E[u].push_back(v);
    15     W[u].push_back(w1);
    16 }
    17 
    18 struct cmp{
    19     bool operator()(dott &a,dott&b){
    20         return a.v>b.v;
    21     }
    22 };
    23 
    24 dott made(int x,int y){
    25     dott mid;
    26     mid.num=x;
    27     mid.v=y;
    28     return mid;
    29 }
    30 
    31 void dij(){
    32     priority_queue<dott,vector<dott>,cmp >q;
    33     memset(dis,127,sizeof(dis));
    34     dis[1]=0;
    35     q.push(made(1,0));
    36     while(!q.empty()){
    37         dott mid=q.top();
    38         q.pop();
    39         if (mid.v>dis[mid.num]) continue;
    40         int minn=mid.num;
    41         for (int j=0;j<E[minn].size();j++){
    42             if (W[minn][j]+dis[minn]<dis[E[minn][j]]){
    43                 dis[E[minn][j]]=W[minn][j]+dis[minn];
    44                 q.push(made(E[minn][j],dis[E[minn][j]]));
    45             }    
    46         }
    47     }
    48 }
    49 
    50 
    51 int main(){
    52     scanf("%d",&n);
    53     int u,v,w1;
    54     for (int i=1;i<=n;i++){
    55         for (int j=1;j<=n;j++) scanf("%d",&map[i][j]);
    56     }
    57 
    58     for (int i=1;i<=n;i++)
    59         for (int j=1;j<i;j++) {
    60             add(j,i,map[i][j]);
    61             add(i,j,map[i][j]);
    62         }
    63     dij();
    64     printf("%d",dis[n]);
    65 }

    SPFA

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<vector>
     4 using namespace std;
     5 const int MAXN=100;
     6 vector<int> E[MAXN],V[MAXN];
     7 bool vis[MAXN];
     8 int s=1,u,v,w,n,m,dis[MAXN],b[MAXN*2];
     9 void add(int u,int v,int w){
    10     E[u].push_back(v);
    11     V[u].push_back(w);
    12 }
    13 
    14 void spfa(){
    15     int h=0,t=1;
    16     memset(dis,127,sizeof(dis));
    17     dis[s]=0;
    18     b[t]=s;
    19     while (h<t){
    20         h++;
    21         int now=b[h];
    22         vis[now]=0;
    23         for (int i=0;i<E[now].size();i++){
    24             int mid=E[now][i];
    25             if (dis[mid]>dis[now]+V[now][i]){
    26                 dis[mid]=dis[now]+V[now][i];
    27                 if (!vis[mid]){
    28                     t++;
    29                     b[t]=mid;
    30                     vis[t]=1;
    31                 }
    32             } 
    33         }
    34     }
    35 }
    36 
    37 int main(){
    38     scanf("%d%d",&n,&m);
    39     for (int i=0;i<m;i++){
    40         scanf("%d%d%d",&u,&v,&w);
    41         add(u,v,w);
    42         add(v,u,w);
    43     }
    44     spfa();
    45     printf("%d",dis[n]);
    46     return 0;
    47 }
  • 相关阅读:
    ✨Synchronized底层实现---偏向锁
    🌞LCP 13. 寻宝
    ✨Synchronized底层实现---概述
    ⛅104. 二叉树的最大深度
    c++多线程之顺序调用类成员函数
    C++ STL实现总结
    C#小知识
    C#中HashTable和Dictionary的区别
    WPF的静态资源(StaticResource)和动态资源(DynamicResource)
    WPF之再谈MVVM
  • 原文地址:https://www.cnblogs.com/wuminyan/p/5079146.html
Copyright © 2011-2022 走看看