HDU1874(最短路问题:Dijskra+Floyd+Bellman-Ford+SPFA)

#include <cstdio>
#include <cstdlib>
#include <cstring>

const int max=1000000;

int main()
{
	int N,M;
	while (scanf("%d",&N)!=EOF)
	{
		int i,j;
		int x,y,dis;
		int d[200][200];
		int result[200]={0};
		int record[200]={0};
    int s,e;
		for (i=0;i<=N-1;i++)
			for (j=0;j<=N-1;j++)
				d[i][j]=max;
		for (i=0;i<=N-1;i++)
			d[i][i]=0;
    scanf("%d",&M);
    for (i=0;i<=M-1;i++)
    {
      scanf("%d%d%d",&x,&y,&dis);
      if (d[x][y]>dis)
      {
        d[x][y]=dis;
        d[y][x]=dis;
      }
    }
    scanf("%d%d",&s,&e);
    record[s]=1;
    for (i=0;i<=N-1;i++)
    {
    	result[i]=d[s][i];
    }
  	int pos=s;
  	int min;
    while (pos!=e)
    {
    	min=max;
      for (i=0;i<=N-1;i++)
      {
      	if (!record[i] && result[i]<min)
      	{
      		min=result[i];
      		pos=i;
      	}
      }
      record[pos]=1;

      if (min==max)
      	break;
      for (i=0;i<=N-1;i++)
      {
      	if (!record[i] && min+d[pos][i]<result[i])
      	{
      		result[i]=min+d[pos][i];
      	}
      }
    }
    if (result[e]==max)
    	printf("-1\n");
    else
      printf("%d\n",result[e]);
	}
	return 0;
}

上面是Dijskra算法

Bellman-Ford:

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
	int n,m;
	const int maxn=10000000;
	
	while (scanf("%d",&n)!=EOF)
	{
		int i,j,k;
		int s,e;
		int x,y,dis;
		int d[500][500];
		int dist[500];
		
		for (i=0;i<=n-1;i++)
			for (j=0;j<=n-1;j++)
			{
				if (i==j)
					d[i][j]=0;
				else
   				d[i][j]=maxn;
			}
		
		scanf("%d",&m);
		for (i=0;i<=m-1;i++)
		{
			scanf("%d%d%d",&x,&y,&dis);
			if (dis<d[x][y])
			{
				d[x][y]=dis;
				d[y][x]=dis;
			}
		}
		
		scanf("%d%d",&s,&e);
		for (i=0;i<=n-1;i++)
			dist[i]=d[s][i];
		
		for (i=2;i<=n;i++)
		{
			for (j=0;j<=n-1;j++)
			{
				if (j!=s)
				{
					for (k=0;k<=n-1;k++)
					{
						if (dist[j]>dist[k]+d[k][j])
							dist[j]=dist[k]+d[k][j];
					}
				}
				//for (k=0;k<=n-1;k++)
					//printf("%d ",dist[k]);
				//printf("\n");
			}
		}
		
		if (dist[e]==maxn)
			printf("-1\n");
		else
			printf("%d\n",dist[e]);
	}
	return 0;
}

Floyd:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int max=1000000;
    int n;
    while (scanf("%d",&n)!=EOF)
    {
        int d[200][200];
    int m;
    scanf("%d",&m);
        int i,j,k;
        for (i=0;i<=n-1;i++)
            for (j=0;j<=n-1;j++)
            {
                if (i==j)
                  d[i][j]=0;
                else
                  d[i][j]=max;
            }

        int s,e;
    for (i=0;i<=m-1;i++)
    {
        int dis,x,y;
      scanf("%d%d%d",&x,&y,&dis);
      if (d[x][y]>dis)
      {
        d[x][y]=dis;
        d[y][x]=dis;
      }
    }
    scanf("%d%d",&s,&e);

        for (k=0;k<=n-1;k++)
            for (i=0;i<=n-1;i++)
                for (j=0;j<=n-1;j++)
                    if (d[i][k]+d[k][j]<d[i][j])
                        d[i][j]=d[i][k]+d[k][j];

        if (d[s][e]==max)
            printf("-1\n");
        else
            printf("%d\n",d[s][e]);
    }
    return 0;
}                                 

SPFA:

#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;

int main()
{
	const int maxn=100000000;
  int N,M;
	while (scanf("%d",&N)!=EOF)
	{
		scanf("%d",&M);
		queue<int> Q;
		int i,j;
		int s,e;
		int a,b,dis;
		bool visit[200]={false};
		int A[200][200];
		int d[200];
		for (i=0;i<=N-1;i++)
			d[i]=maxn;
		for (i=0;i<=N-1;i++)
			for (j=0;j<=N-1;j++)
				A[i][j]=maxn;
		for (i=0;i<=M-1;i++)
		{
			scanf("%d%d%d",&a,&b,&dis);
			if (dis<A[a][b])
			  A[a][b]=A[b][a]=dis;
		}
		scanf("%d%d",&s,&e);
		
		d[s]=0;
		visit[s]=true;
		Q.push(s);
		while (!Q.empty())
		{
			int temp=Q.front();
			Q.pop();
			for (i=0;i<=N-1;i++)
			{
				if (d[temp]+A[temp][i]<d[i])
				{
					d[i]=d[temp]+A[temp][i];
					if (!visit[i])
					{
						Q.push(i);
						visit[i]=true;
					}
				}
			}
			visit[temp]=false;
		}
		if (d[e]!=maxn)
		  printf("%d\n",d[e]);
		else
			printf("-1\n");
	}
	return 0;
}

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/immiao/article/details/12176657
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞