(Realx dijkstra1.1)POJ 1797 Heavy Transportation(使用dijkstra来解决最大生成树问题)

来源:互联网 发布:大数据集群服务器配置 编辑:程序博客网 时间:2024/04/29 06:48

题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量
解题思路:其实这个求最大边可以近似于求最短路,只要修改下找最短路更新的条件就可以了


#include <iostream>#include <cstdio>#include <cmath>using namespace std;const int maxn = 1100;const int inf = -10000000;//***这是使用dijkstra来解决最大生成树是需要改的地方.1)int map[maxn][maxn];int d[maxn];int s[maxn];int n, m;/** * dijkstra算法用于有向加权图的最短路径问题 * * 有一个大神总结的很好(至少我个人比较赞同..): * 用最小生成树算法来求最小边权和 * 用dijkstra算法将所有的最小值都存起来 */int dijkstra(int v) { //选择v作为源节点,利用dijkstra算法计算源节点v到各节点的最短路径int i;for (i = 1; i <= n; ++i) { //初始化s[i] = 0; //s[i] = 0,表示i节点未被访问过d[i] = map[v][i]; //将d[i]定义为源节点v到节点i的最短距离}int j;for (i = 1; i < n; ++i) {//这里< 或者是 <= 都会ACint mmin = inf;int pos;for (j = 1; j <= n; ++j) {if (!s[j] && mmin < d[j]) {//***这是使用dijkstra来解决最大生成树是需要改的地方.2)pos = j;mmin = d[j];}}s[pos] = 1;for (j = 1; j <= n; ++j) {if (!s[j] && (d[j]<min(d[pos],map[pos][j]))) {//***这是使用dijkstra来解决最大生成树是需要改的地方..3)d[j] = min(d[pos],map[pos][j]);}}}return d[n]; //返回所要求的源节点到n节点的最短路径}int main() {int t;scanf("%d", &t);int counter = 1;while (t--) {scanf("%d%d", &n, &m);memset(map, 0, sizeof(map));int i;for (i = 1; i <= m; ++i) {int a, b, c;scanf("%d%d%d", &a, &b, &c);map[a][b] = map[b][a] = c;}printf("Scenario #%d:\n", counter++);printf("%d\n\n", dijkstra(1));}return 0;}


原创粉丝点击