本文通過一道OJ題目來驗證下面超鏈接中有關SPFA算法的內容
SPFA算法原理: http://blog.csdn.net/u010232171/article/details/42061823
題目超鏈接: http://hihocoder.com/contest/hiho25/problem/1
<span style="font-size:14px;">#include<queue>
#include<stdio.h>
using namespace std;
vector< pair<int,int> > graph[100010];
int arrdis[100010];
bool flag[100010];
int N,M,S,T;
queue<int> qe;
int main()
{
int key,val,disn,pnode,ft,pdis;
//初始化圖,使用vector容器的數組+容器內的pair類型,其中數組下標表示起點,容器內的pair.first表示終點,pair.second表示點與點間距離
scanf("%d %d %d %d",&N,&M,&S,&T);
//fflush(stdin);
int s,t,dis;
for(int i=0;i<M;i++){
scanf("%d %d %d",&s,&t,&dis);
graph[s-1].push_back(make_pair(t-1,dis));
graph[t-1].push_back(make_pair(s-1,dis));
}
//初始化單源最短距離表
fill(arrdis, arrdis+N, 1000000007);
//將推入隊尾加入隊列
//同時記錄該點已入隊
qe.push(S-1);
arrdis[S-1]=0;
flag[S-1]=true;
//開始SPFA算法
while(!qe.empty()){
pnode=qe.front(); //出隊
qe.pop();
pdis=arrdis[pnode];
flag[pnode]=false;
int sz=graph[pnode].size();
for(int i=0;i<sz;++i){ //掃描出隊點的相關點
key=graph[pnode][i].first;
val=graph[pnode][i].second;
disn=pdis+val;
if(arrdis[key]>disn){ //更新距離
arrdis[key]=disn;
if(!flag[key]){ //更新隊列
qe.push(key);
flag[key]=true;
}
}
//disk=disk>disn?disn:disk;
}
}
printf("%d\n",arrdis[T-1]);//輸出題目要求的最短距離
return 0;
}</span>
上述代碼通過了OJ,但在通過之前遇到多次TLM的問題,即超時。
在跟師兄討論後,發現是輸入數據部分佔用了大量時間。在scanf語句後面使用fflush函數是想避免回車對輸入的影響,這個問題之前確實有過,但是在本例的OJ中不會遇到。
所以,以後使用scanf時應該注意,不需要將過去習慣中的fflush函數添加。事實證明,fflush函數還是很耗時的,不加它t=143ms,加上它t=1450ms,這個數字是OJ給的。
另外一個就是大的數組應該定義爲全局變量,如果定義爲局部變量會出現 stack overflow的問題,這主要跟不同的變量所在的區域有關係。局部變量在棧區定義,而全局變量在堆區。