# 1003. Emergency (25)

317人阅读 评论(0)

pat

1、Dijkstra算法，就是求源点到目标点最短路径。这个算法有点忘，看了书，后来才回想起来。

2、dijkstra算法的意思，就是把点分为两个集合，一个集合是已经算出最短路径，另一个就是待算的，

3、map[myStart][myEnd] = map[myEnd][myStart] = myLength;  就是这一句，一开始理解为有向图，

#include"stdio.h"
#include"string.h"
#include"math.h"
#include<iostream>
#include<vector>
using namespace std;
#define INF 0x7FFFFFFF
struct city{
int emergencyNum;
int distance;
};
vector<int> team;
vector<bool> visit;
vector<vector<int>> map;
vector<struct city> cities;

int countShortest(){
int min = INF;
int index = -1;
for(int i = 0;i < cities.size();i++){
if(visit[i] == false && cities[i].distance < min){
min = cities[i].distance;
index = i;
}
}
return index;
}

void digistra(int start,int end){
//initialization
for(int i = 0;i < cities.size();i++){
cities[i].distance = INF;
cities[i].emergencyNum = 0;
}
cities[start].distance = 0;
cities[start].emergencyNum = team[start];

//monify the shortest ways of each point
while(true){
int index = countShortest();
if(index == -1){
return;
}
visit[index] = true;
if( index == end ){
return;
}
for(int i = 0;i < cities.size();i++){
if(visit[i] || map[index][i] == INF){
continue;
}
//modify
if(cities[i].distance > cities[index].distance + map[index][i]){
cities[i].distance =  cities[index].distance + map[index][i];
cities[i].emergencyNum = cities[index].emergencyNum + team[i];
}else if(cities[i].distance == cities[index].distance + map[index][i]){
if(cities[i].emergencyNum < cities[index].emergencyNum + team[i]){
cities[i].emergencyNum = cities[index].emergencyNum + team[i];
}
}
}

}
}

int main(){
int cityNum;
while(scanf("%d",&cityNum) != EOF){
team.resize(cityNum);

visit.resize(cityNum);
visit.assign(cityNum,false);

map.resize(cityNum);

for(int i = 0;i < cityNum;i++)
map[i].assign(cityNum,INF);

cities.resize(cityNum);

for(int i = 0;i < cityNum;i++){
scanf("%d",&team[i]);
}

for(int i = 0;i < roadNum;i++){
int myStart,myEnd,myLength;
scanf("%d%d%d",&myStart,&myEnd,&myLength);
if(map[myStart][myEnd] > myLength){     //get the shortest
map[myStart][myEnd] = map[myEnd][myStart] = myLength;
}
}
digistra(startPoint,endPoint);
}
return 0;
}

0
0

个人资料
• 访问：148043次
• 积分：3388
• 等级：
• 排名：第11749名
• 原创：201篇
• 转载：16篇
• 译文：0篇
• 评论：26条
contact

### luoan007@gmail.com

回复会在三天之内~
博客专栏
 Mysql学习与实践笔记 文章：12篇 阅读：6060
 设计模式学习笔记 文章：25篇 阅读：6382
 Java语言下单例模式的实现 文章：6篇 阅读：5134
 javaweb基于内容的图片搜索 文章：7篇 阅读：26190
设计模式整个代码及类图
设计模式相关代码以及类图的整个项目都托管到了github上，包括各个模式的示例代码以及类图，类图则用的visio绘制，整个visio文件也在该项目上，这里贴上地址： https://github.com/anLA7856/design 如果觉得有帮助，star一下呗~我会非常开心的
阅读排行
最新评论