首页 > 学院 > 开发设计 > 正文

HDU 2544 最短路

2019-11-08 00:50:54
字体:
来源:转载
供稿:网友

最短路

题目链接:http://acm.split.hdu.edu.cn/showPRoblem.php?pid=2544

注释详见代码:

//这个题目是一个很典型的迪杰斯特拉的最短路径题目。//用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 #include<iostream>#include<cstdio>#include<cstring>using namespace std;#define INF 0x3f3f3f3;int map[102][102],dis[110],visited[110];void Dj(int n,int x){    int p;    for(int i=1;i<=n;i++)    {        dis[i]=map[1][i];        visited[i]=0;    }    visited[x]=1;    for(int i=1;i<=n;i++)    {        int min=INF;        for(int j=1;j<=n;j++)                {            if(!visited[j] && dis[j]<min)	//在已经可达且未访问的点中找一个最小的结点             {                p=j;                min=dis[j];            }        }        visited[p]=1;	//遍历这个点的可达点         for(int j=1;j<=n;j++)        {            if(!visited[j] && dis[p]+map[p][j]<dis[j])	//取最小的更新dis[]             {                    dis[j]=dis[p]+map[p][j];              }        }    }}int main(){//第一个数N表示终点,求的是1到N的最短路径。M是路径的数量。    int n,m;    int x,y,d;    while(scanf("%d%d",&n,&m),n+m)    {        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                map[i][j]=INF;        for(int i=1;i<=m;i++)        {            scanf("%d%d%d",&x,&y,&d);            map[x][y]=map[y][x]=d;        }        Dj(n,1);        printf("%d/n",dis[n]);    }    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表