SPFA算法的實現

本文通過一道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的問題,這主要跟不同的變量所在的區域有關係。局部變量在棧區定義,而全局變量在堆區。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章