首页 > 代码库 > D - 图论
D - 图论
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 11 2 33 31 2 52 3 53 1 20 0
Sample Output
32
这是一道最短路的水题,但对我这种菜菜来说还是有难度的,其实每种算法,先把基础的做懂了,理解透了才能通百窍。有关于最短路DIJ算法的,我问了王大神差不多有
5次。。。。。。菜菜啊==
计算从起点到各个点的最短路,然后利用贪心,更新到该结点的最短路
if(!vis[j] && dij[p]+map[p][j]<dij[j])判断是否是最短路 {
dij[j]=dij[p]+map[p][j]; }
1 #include<cstdio> 2 #include<string.h> 3 using namespace std; 4 #define INF 1000000000 5 int map[1000][1000]; 6 int n,m; 7 int dij[10010]; 8 int vis[10010]; 9 void Dij(int y,int x)10 {11 int i,p,j,min;12 for (i=1;i<=y;i++)13 {14 dij[i]=map[1][i];15 vis[i]=0;//初始化,是否被访问16 }17 vis[x]=1;//标记已访问过的路18 for (i=1;i<=y;i++)19 {20 min=INF;//每次都找到最短路21 for (j=1;j<=y;j++)22 {23 if(!vis[j] && dij[j]<min)24 {25 p=j;26 min=dij[j];27 }28 }29 vis[p]=1;//标记被访问的路30 for (j=1;j<=y;j++)31 {32 if(!vis[j] && dij[p]+map[p][j]<dij[j])//判断是否是最短路33 {34 dij[j]=dij[p]+map[p][j];//及时更新!!!35 }36 }37 }38 }39 int main()40 {41 //int n,m;42 int a,b,t;43 while(scanf("%d %d",&n,&m)&&(n!=0&&m!=0))44 {45 for(int i=1;i<=n;i++)46 for(int j=1;j<=n;j++)47 {48 map[i][j]=INF;//INF是无穷大,说明这条路是不通的49 }50 for(int i=1;i<=m;i++)//m表示总共有M条路51 {52 scanf("%d %d %d",&a,&b,&t);53 map[a][b]=map[b][a]=t;//此路是通的,此图是无向图54 }55 Dij(n,1);//DijKstra算法56 printf("%d\n",dij[n]);终点是n,计算1到n的最短路57 }58 return 0;59 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。