1003. Emergency<Dijstra><多条最短路径>

来源:互联网 发布:js混淆加密工具 下载 编辑:程序博客网 时间:2024/05/17 09:42

题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1003

参考他人代码。


这种Dijstra的实现,与之前的文章提到的Dijstra的实现不同(http://blog.csdn.net/staibin/article/details/20702925)。之前提到的是直接初始化起点,遍历n-1个节点。现在这种实现是遍历n个节点,所以过程上有些差异。

#include <stdio.h>#define SIZE500+5#define INF1<<30int n, m, s, e;int map[SIZE][SIZE];bool mark[SIZE];int dis[SIZE];// 必备int team[SIZE];int maxteam[SIZE];int pathcount[SIZE];// 题目需求void dij(){// 1. 寻找最近点// 2. 未找到或为终点,返回// 3. 把改点加入,处理与改点相连的点// 初始化pathcount[s] = 1;dis[s] = 0;maxteam[s] = team[s];int i, j;for(i=0; i<n; i++){int p, min = INF;for(j=0; j<n; j++){if(mark[j] == false && dis[j] < min){p=j;min=dis[j];}}// 寻找未被访问且距离最小的节点if(p == e || min == INF){return ;}// 到终点,或者没有所连的点mark[p] = true;for(j=0; j<n; j++){if(mark[j] == false){int discost = dis[p]+map[p][j];// 计算未访问节点距起点的距离if(discost < dis[j]){dis[j] = discost;pathcount[j] = pathcount[p];maxteam[j] = maxteam[p]+team[j];}else if(discost == dis[j])//以前有点可到达节点i{// pathcount[j]++;// 这样是错的,因为到p的路径可能不止一条pathcount[j] += pathcount[p];maxteam[j] = maxteam[j] > maxteam[p]+team[j] ? maxteam[j] : maxteam[p]+team[j];}// (a) new pathelse{// a longer path, doing nothing}}}}// 遍历n个节点return ;}void Init(){int i;for(i=0; i<n; i++){mark[i] = false;dis[i] = INF;team[i] = 0;pathcount[i] = 0;maxteam[i] = 0;for(int j=0; j<n; j++){map[i][j] = INF;}}return ;}int main(){#ifdef ONLINE_JUDGE#elsefreopen("E:\\in.txt", "r", stdin);#endifscanf("%d%d%d%d", &n, &m, &s, &e);Init();int i;for(i=0; i<n; i++){scanf("%d", &team[i]);}for(i=0; i<m; i++){int c1, c2, l;scanf("%d%d%d", &c1, &c2, &l);map[c1][c2] = map[c2][c1] = l;}dij();printf("%d %d\n", pathcount[e], maxteam[e]);return 0;}


0 0
原创粉丝点击