1003 Dijkstra算法

#include<stdio.h>
#include<string.h>
#define MAXVEX 100 // 定义的最大定点数
#define INFINITY 65535 //定义一个极大数
int final[MAXVEX];//为1即代表当前坐标的最短路径已经找到
int map[MAXVEX][MAXVEX];//代表权值
int m,n;//分别表示几个城市
int num[MAXVEX];//最短路径条数
int team[MAXVEX];//可集结的最多救援队数量
int dis[MAXVEX];//存放所有结点的权值
int city[MAXVEX];//代表救援队的数目
int c1,c2;//初始结点和目标结点

int main()
{
void Dijkstra();
scanf("%d %d %d %d",&m,&n,&c1,&c2); //m代表城市数量,n代表路数量
memset(final,0,n);//将所有节点设置为未被访问
for(int i=0;i<m;++i)
{
scanf("%d",&city[i]);//给城市数量的救援人数赋值
}
for(int i=0;i<m;++i)
{
for(int j=0;j<m;++j)
{
//给每条路赋权值,注意是所有路都赋极大值INFINITY
map[i][j] = INFINITY;
}

}
for(int i=0;i<n;++i)//给n条路设定值
{

int start,end,length;// 起点,终点,起点到终点的权值
scanf("%d %d %d",&start,&end,&length);
map[start][end] = length;
map[end][start] = length;//双向赋值
}
Dijkstra();
printf("%d %d",num[c2],team[c2]);
return 0;

}

void Dijkstra(){
int ct;//设置一个中间节点
for(int i=0;i<m;++i){
//把到没个结点的权值都存放入数组中
dis[i] = map[c1][i];//从c1开始
}
memset(num,0,m);//给m个结点的最短路径条数都初始化为0
memset(team,0,m);//给m个结点的救援人员总数量都初始化为0
num[c1] = 1;//表示c1这个节点的路径为1
dis[c1] = 0;//到c1的权值为0;
team[c1] = city[c1];
ct = -1;//将中间结点赋值为-1做标记
while(c1!=c2){
int min = INFINITY;//设置一个最小距离值
for(int i=0;i<m;++i)
{
if(!final[i]&&dis[i]<min){
min = dis[i];
ct = i;//此ct相当于【大话数据结构】dijastra算法中的k
}
}
final[ct] = 1;//表示当前结点的最短路径已经求得
for(int i=0;i<m;++i) {//这个循环尤其重要,用来修正路径权值 *****************************
if(!final[i]){
if(dis[i]>min+map[ct][i]){
dis[i] = min + map[ct][i];
team[i] = city[i]+team[ct];
num[i] = num[ct];

} else if(dis[i] == min + map[ct][i])
{
num[i] = num[i] + num[ct];
if(team[i]<team[ct]+city[i])
team[i] = team[ct] + city[i];
}
}
}
}
}

原文地址:https://www.cnblogs.com/purpleone/p/10822421.html