题目链接: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;}
新闻热点
疑难解答