hdu1874(dijkstra)

来源:互联网 发布:windows文件监控 编辑:程序博客网 时间:2024/06/11 00:51

发现好多算法都不会写了。

#include <stdio.h>#include <stdlib.h>#include<string.h>#define max 10000000int m,n;int dis[205][205];int s,t;void init(int ars[][205]){    int i ,j;    for(i=0;i<202;i++)       for(j=0;j<202;j++)       {           if(i!=j)              dis[i][j]=max;       }}void dijkstra(int ars[][205],int m,int s){    int final[205]={0};    //当其值为1时表示最近点从源点到此点最近已经找到    int x,min;    int i,j;    final[s]=1;    for(i=0;i<m;i++)    {      min=max;      for(j=0;j<m;j++)      {        if(!final[j]&&ars[s][j]<min)  //从所有没有最短路径的点中找到一个最短的        {            min=ars[s][j];            x=j;        }      }        final[x]=1;        for(j=0;j<m;j++)            dis[j][s]=dis[s][j]=dis[s][j]<(dis[s][x]+dis[x][j])?dis[s][j]:dis[s][x]+dis[x][j];    }           //以刚找到的点从中间点做一次松驰}int main(){    int i ;    int x,y,a;    while(scanf("%d %d",&m,&n)!=EOF)    {     memset(dis,0,sizeof(dis));     init(dis);     for(i=0;i<n;i++)     {       scanf("%d %d %d",&x,&y,&a);       dis[y][x]=dis[y][x]<a?dis[x][y]:a;       dis[x][y]=dis[y][x];     }     scanf("%d %d",&s,&t);     dijkstra(dis,m,s);     if(dis[s][t]==max)        printf("-1\n");    else        printf("%d\n",dis[s][t]);    }    return 0;}


原创粉丝点击