hdu 2544 最短路
稍微修改了一下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;
}

浙公网安备 33010602011771号