最短路徑問題,具體可以用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;}