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;
}
原文地址:https://www.cnblogs.com/nanke/p/2136591.html