专题四1009

题目大意:

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

输入:

输入包括多组数据。每组数据第一行是两个整数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分钟的时间走过这条路。<br>输入保证至少存在1条商店到赛场的路线。

输出:

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

解题思路:

这道题是中文的题面,所以题意理解比较简单。看完题目之后,知道这是一道求单源点最短路径问题。因为这道题目的边的权值全是正数,所以我选择Dijkstra算法。用邻接矩阵存储边结构,二维数组。然后全部初始化为maxint,然后dist数组也同样初始化为maxint,之后在输入边的信息的时候给二维数组c[][]赋值的时候注意了,因为这是一道无向图的问题,因此不仅c[a][b]=m,而且c[b][a]=m,我就是错在了这里,之后具体的算法就是课件上抄的了,然后自己在主函数里面初始化。

感想:

其实对这个算法真的不理解,但是靠着课件上的算法的代码,然后加上自己的一部分理解,初始化了数组之后,没想到过了。

代码如下:

#include<iostream>

using namespace std;

#define NUM 100

#define maxint 10000

void dijkstra(int n, int v, int dist[], int prev[], int c[][NUM])

{

int i, j;

bool s[NUM];

for (i = 1; i <= n; i++)

{

if(c[v][i]!=maxint)

dist[i] = c[v][i];

s[i] = false;

if (dist[i] = maxint)

prev[i] = 0;

else

prev[i] = v;

}

dist[v] = 0;

s[v] = true;

for (i = 1; i < n; i++)

{

int temp = maxint;

int u = v;

for (j = 1; j <= n; j++)

{

if (!s[j] && dist[j] < temp)

{

u = j;

temp = dist[j];

}

}

s[u] = true;

for (j = 1; j <= n; j++)

{

if (!s[j] && c[u][j] < maxint)

{

int newdist = dist[u] + c[u][j];

if (newdist < dist[j])

{

dist[j] = newdist;

prev[j] = u;

}

}

}

}

}

int main()

{

int n,m, v, dist[NUM], prev[NUM], c[20][NUM],a,b,time;

while (cin >> n)

{

cin >> m;

if (n == 0 && m == 0)

break;

for (int i = 1; i <= n; i++)

{

dist[i] = maxint;

for (int j = 1; j <= n; j++)

c[i][j] = maxint;

}

for (int i = 1; i <= m; i++)

{

cin >> a >> b >> time;

c[a][b] = time;

c[b][a] = time;

}

dijkstra(n, 1, dist, prev, c);

cout << dist[n] << endl;

}

return 0;

}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值