稍微修改了一下hdu1874的代码就直接过了
不过 31ms 缺陷,一大缺陷
FSPA版:
#include<iostream> #include<string> #include<algorithm> #define MAXN 110 using namespace std; int map[MAXN][MAXN]; //map[i,j]为初始输入的i到j的距离,未知的map[i,j]=INT_MAX; int dis[MAXN],Q[MAXN*100]; char vst[MAXN]; // 参数n表示结点数,s表示源点 int SPFA(int n, int s) { // pri是队列头结点,end是队列尾结点 int i, pri, end, p; memset(vst, 0, sizeof(vst)); for(int i=0; i<MAXN; ++i) Q[i] = 0; for (i=1; i<=n; i++) dis[i] = INT_MAX; dis[s] = 0; vst[s] = 1; Q[1] = s; pri = 1; end = 2; while (pri < end) { p = Q[pri]; for (i=1; i<=n; ++i) { //更新dis if (map[p][i]!=INT_MAX&&dis[p]+ map[p][i]<dis[i]) { dis[i] = dis[p]+map[p][i]; if (!vst[i]) //未在队列中 { Q[end++] = i; vst[i] = 1; } } } vst[p] = 0; // 置出队的点为未标记 pri++; } return 1; } int main() { int n,m; while(cin>>n>>m&&(n||m)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) map[i][j]=INT_MAX; int a,b,len; for(int i=0;i<m;i++) { cin>>a>>b>>len; if(len<map[a][b]) { map[a][b]=len; map[b][a]=len; } } SPFA(n,1); cout<<dis[n]<<endl; } return 0; }
dijkstra版:
#include<iostream> #include<string> using namespace std; bool s[101]; int c[110][110],dis[110],n,m; void dijkstra() { for(int i=1;i<=n;i++) { dis[i]=c[1][i]; } dis[1]=0; for(int i=2;i<=n;i++) { int tmp=INT_MAX,v=1; for(int j=1;j<=n;j++) if(!s[j]&&dis[j]<tmp) { tmp=dis[j]; v=j; } s[v]=1; for(int j=1;j<=n;j++) if(!s[j]&&c[v][j]<INT_MAX) { int newdis=dis[v]+c[v][j]; if(newdis<dis[j]) dis[j]=newdis; } } } int main() { int len; while(cin>>n>>m&&(n||m)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c[i][j]=INT_MAX; int a,b; for(int k=0;k<m;k++) { cin>>a>>b>>len; if(len<c[a][b]) { c[a][b]=len; c[b][a]=len; } } memset(s,0,sizeof(s)); s[1]=1; dijkstra(); cout<<dis[n]<<endl; } return 0; }