简单图论之最短路径(两种算法)

题目链接

Floyd:

#include 

const int INF = 0xfffffff;		
#define maxn 310
int grap[maxn][maxn];			//邻接矩阵存储图
int n , m;
int dist[maxn][maxn];			//记录从所有点之间的最短距离

int min(int a,int b)
{
	return a>b?b:a;
}

void init()				// 对一些数据进行初始化
{
	int i , j;
	for(i = 0; i < n; i++)
		for(j = 0; j < n; j++)
			grap[i][j] = (i==j?0:INF);	
}
void floyd()
{
	int i , j , k;
	//初始化, 一开始每个点与点之间的路径长度 就等于grap中的长度
  for(i = 0; i < n; i++)
     for(j = 0; j < n; j++)
          dist[i][j] = grap[i][j];
     for(k = 0; k < n; k++)			
       for(i = 0; i < n; i++)
         for(j = 0; j < n; j++)
         { 
           if(k ==i || k == j) 	
                   continue;   
            dist[i][j] = min(dist[i][k] + dist[k][j],dist[i][j]);
         }
}
int main()
{
      while(scanf("%d %d" , &n , &m)!=EOF)
       {
         init();int i , x , y , z;
         for(i = 0; i < m; i++) 	//对有向图进行存储
         {
             scanf("%d %d %d" , &x , &y , &z);
		 //对每一组输入数据取与原来数据比较,两点多条路取最小路
              grap[x][y] = min(grap[x][y],z);
                 grap[y][x] = min(grap[y][x],z);	 
         }
		floyd();

		int s,t;
		scanf("%d %d",&s,&t);

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



dijkstra:

#include 

int a[205][205];  //记录邻接矩阵
int dist[205];	  //到每个点的最短路
int m,n;		//m条路,n个点

const int INF=0xfffffff;

void init()					//初始化数据
{
	for(int i=0;idist[j])
		{
			min=dist[j];
			x=j;
		}
	    }

	    sign[x]=1;		//标记,已走过

	    for(j=0;j




你可能感兴趣的:(acm)