最短路徑問題(演算法模板)

來源:互聯網
上載者:User
最短路徑問題,具體可以用dijkstr演算法,ford演算法。。還有SPFA等等。
然後各種 演算法在實際問題又有區別。
SPFA在稀疏圖上快,因為是通過邊來增廣的。dijkstra在稠密圖上快。因為是通過點來增廣的。某些情況下dijkstra 加上 堆最佳化 在處理大資料的時候會比SPFA快很多。但是SPFA在隨機資料的綜合表現中相比dijkstra優勢還是比較大的。

spfa演算法模板:

#include<iostream>#include<queue>using namespace std;int cost[53][53];int n,ans;bool visited[53];int dist[53];void SPFA(int Start){int i;for(i=1;i<=52;i++)dist[i]=100000000;                      //初始化start點到其他點的距離為無限。dist[Start]=0;                               //start到本身的距離為0queue<int >q;q.push(Start);while(!q.empty()){int u=q.front();  q.pop();visited[u]=false;for(i=1;i<=52;i++)if(dist[i]>dist[u]+cost[u][i]){dist[i]=dist[u]+cost[u][i];if(!visited[i]){visited[i]=true;q.push(i);}}}}int main(){int i,j;    scanf("%d",&n);getchar();    for ( i=1;i<=52;i++)        for ( j=1;j<=52;j++)            if (i==j) cost[i][j]=0;            else cost[i][j]=0xFFFFFFF;    char ch1,t,ch2; int x,y,c,p;    for ( i=1;i<=n;i++)    {        scanf("%c%c%c%d",&ch1,&t,&ch2,&c);        if (ch1>='A' && ch1<='Z') x=(ch1-64);        else x=(ch1-96)+26;        if (ch2>='A' && ch2<='Z') y=(ch2-64);        else y=(ch2-96)+26;        if (cost[x][y]>c)//防止重邊        {            cost[x][y]=c; cost[y][x]=c;        }        getchar();    }    for ( i=1;i<=52;i++)visited[i]=false;SPFA(26);    int ans=0xFFFFFFF;         for ( i=1;i<=25;i++)        if (ans>dist[i])        {            ans=dist[i]; p=i;        }    printf("%c %d\n",char(p+64),ans);    return 0;}

dijkstra演算法:

#include <iostream>using namespace std;const int maxn=2000;int n,m;int f[maxn+1][maxn+1];int s,t;double dist[maxn+1];bool hash[maxn+1];void init(){cin>>n>>m;int a,b,c;for (int i=0;i<m;i++){cin>>a>>b>>c;f[a][b]=c;f[b][a]=c;}cin>>s>>t;}void dijkstra(){int i,j;for(i=1;i<=n;i++){if(f[s][i]==0)         //沒用通過的方法{dist[i]=100000.0;continue;}dist[i]=100.0*100/(double)(100-f[s][i]);}dist[s]=100000.0;  hash[s]=true;for ( i=1;i<n;i++)              //做N-1找s到剩下點的最短路徑。{double min=100000.0;int u=0;for ( j=1;j<=n;j++)                            //找出身下未添加的點,當中的到s的最短距離。{if (hash[j]) continue;if (min>dist[j]) {min=dist[j];u=j;}}hash[u]=true;                                        //標記u點添加到找到集合for ( j=1;j<=n;j++){if (f[u][j]==0) continue;                      if (dist[j]>dist[u]*100/(double)(100-f[u][j]))            //如果有一個點能通過u到達j使得原來到達j的距離大於 這條路的距離,那麼改變dist[j]的大小                dist[j]=dist[u]*100/(double)(100-f[u][j]);}}//cout<<dist[t]<<endl;printf("%.8lf\n",dist[t]);}int main(){    init();    dijkstra();    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.