HDU 2544 最短路(Dijkstra)

题目地址:点击打开链接

思路:模板题,考虑到商店和赛场有可能在一个路口,结果把dist[1]=0去掉还能AC,数据还没变态到这种程度,这类题应该还要判断重边的可能,否则大值有可能会覆盖小值,本题不用考虑,懒得改了,还有就是尽量把初始地和目的地放进变量里,方便以后套模板

思路2:和第一个不同的是全都跑完了

思路3:第一次参照别人写的SPFA代码,有时间改

AC代码:

#include <iostream>
#include <cstdio>

using namespace std;

int a[110][110],dist[110],visit[110];
int n,m;
const int maxn = 1000000;

void dijkstra()
{
    int x,y,z;
    int i,j,min1,k;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            a[i][j] = maxn;
        }
    }
    for(i=1; i<=m; i++)
    {
        cin>>x>>y>>z;
        a[x][y] = z;
        a[y][x] = z;
    }
    for(i=1; i<=n; i++)
    {
        dist[i] = a[1][i];
        visit[i] = 0;
    }
    dist[1] = 0;
    visit[1] = 1;
    for(i=1; i<n; i++)
    {
        min1 = maxn;
        for(j=1; j<=n; j++)
        {
            if(visit[j] == 0 && dist[j] < min1)
            {
                k = j;
                min1 = dist[j];
            }
        }
        visit[k] = 1;
        if(k == n)//搜到直接退出来就行
            break;
        for(j=1; j<=n; j++)
        {
            if(visit[j] == 0 && dist[k] + a[k][j] < dist[j])
                dist[j] = dist[k] + a[k][j];
        }
    }
}

int main()
{
    while(scanf("%d%d",&n,&m) != EOF)
    {
        if(n + m == 0)
            break;
        dijkstra();
        printf("%d\n",dist[n]);
    }
    return 0;
}

AC代码2

#include <iostream>
#include <cstdio>

using namespace std;

int a[110][110],dist[110],visit[110];
int n,m;
const int maxn = 1000000;

void dijkstra()
{
    int x,y,z;
    int i,j,min1,k;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            a[i][j] = maxn;
        }
    }
    for(i=1; i<=m; i++)
    {
        cin>>x>>y>>z;
        a[x][y] = z;
        a[y][x] = z;
    }
    for(i=1; i<=n; i++)
    {
        dist[i] = a[1][i];
        visit[i] = 0;
    }
    dist[1] = 0;
    visit[1] = 1;
    for(i=1; i<n; i++)
    {
        min1 = maxn;
        for(j=1; j<=n; j++)
        {
            if(visit[j] == 0 && dist[j] < min1)
            {
                k = j;
                min1 = dist[j];
            }
        }
        visit[k] = 1;
        for(j=1; j<=n; j++)
        {
            if(visit[j] == 0 && dist[k] + a[k][j] < dist[j])
                dist[j] = dist[k] + a[k][j];
        }
    }
}

int main()
{
    while(scanf("%d%d",&n,&m) != EOF)
    {
        if(n + m == 0)
            break;
        dijkstra();
        printf("%d\n",dist[n]);
    }
    return 0;
}

错误代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;
const int maxn = 110;
const int inf = 0x3f3f3f3f;

struct node
{
	int to;
	int value;
}tt;

int n,m;
vector<node> vec[maxn];
int dist[maxn];
int visit[maxn];

void spfa()
{
	memset(dist,inf,sizeof(dist));
	memset(visit,0,sizeof(visit));
	dist[1] = 0;
	visit[1] = 1;
	queue<int> que;
	que.push(1);
	while(!que.empty())
	{
		int t = que.front();
		que.pop();
		visit[t] = 0;
		int size = vec[t].size();
		for(int i=0; i<size; i++)
		{
			int value = vec[t][i].value;
			int s = vec[t][i].to;
			if(dist[s] > dist[t] + value)
			{
				dist[s] = dist[t] + value;
				if(visit[s] == 0)
				{
					visit[s] = 1;
					que.push(s);
				}
			}
		}
	}
}

int main()
{
	while(scanf("%d%d",&n,&m))
	{
		for(int i=1; i<=n; i++)
		{
			vec[i].clear();
		}
		if(n + m == 0)
			break;
		for(int i=0; i<m; i++)
		{
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			tt.to = a;
			tt.value = c;
			vec[b].push_back(tt);
			tt.to = b;
			vec[a].push_back(tt);
		}
		spfa();
		printf("%d\n",dist[1]);
	}
}
大神地址:http://blog.csdn.net/watermuch/article/details/7908882

你可能感兴趣的:(HDU 2544 最短路(Dijkstra))