九度oj 1100 一直wa,实在找不出错在哪,求大神指教(dijkstra算法)
N个城市,标号从0到N-1,M条道路,第K条道路(K从0开始)的长度为2^K,求编号为0的城市到其他城市的最短距离
输入:
第一行两个正整数N(2<=N<=100)M(M<=500),表示有N个城市,M条道路
接下来M行两个整数,表示相连的两个城市的编号
输出:
N-1行,表示0号城市到其他城市的最短路,如果无法到达,输出-1,数值太大的以MOD 100000 的结果输出。
样例输入:
4 4
1 2
2 3
1 3
0 1
样例输出:
8
9
11
http://ac.jobdu.com/problem.php?pid=1100
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;
struct s
{
int next; //下一个结点的编号
long int c; //到0点的距离
int jin; //是常数100000的倍数
};
vector<s> arr[101];
int *a;
int *f;
long int *b;
int main()
{
int n, m, i, j,g, o, p,ne,out;
long int q;
while (scanf("%d %d", &n, &m) != EOF)
{
a = (int *)malloc(sizeof(int)*n); //a[]为1代表已被选中,为0代表未选中
f = (int *)malloc(sizeof(int)*n); //存放该点到0点距离是100000的几倍
b = (long int *)malloc(sizeof(long int)*n); //存放该点到0点距离
for (i = 0; i < n; i++)
arr[i].clear();
for (i = 0; i < n; i++)
{
a[i] = 0;
b[i] = -1;//开始距离设为不可达
f[i] = 0;
}
q = 1;
g = 0;
for (i = 0; i < m; i++)
{
scanf("%d %d", &o, &p);
struct s tmp;
tmp.next = o;
if (i>0)
{
q = q * 2;
if (q >= 100000)
{
q = q % 100000;
g++;
}
}
tmp.c = q;
tmp.jin = g;
arr[p].push_back(tmp);
tmp.next = p;
arr[o].push_back(tmp);
}
a[0] = 1;
b[0] = 0;
f[0] = 0;
ne = 0; //从0点开始
out = 0;
for (i = 1; i < n; i++)
{
for (j = 0; j < arr[ne].size(); j++)
{
p = arr[ne][j].next;
q = arr[ne][j].c;
o = arr[ne][j].jin;
if (a[p] == 0)
{
if (b[p] == -1 || f[ne] + o < f[p] || (f[ne] + o == f[p] && b[ne] + q < b[p]))
{
b[p] = b[ne] + q;
f[p] = f[ne] + o;
if (b[p] >= 100000)
{
b[p] = b[p] % 100000;
f[p] = f[p] + 1;
}
}
}
}
for (j = 0; j<n; j++)
{
if (a[j] == 0 && b[j] != -1)
{
out = j;
break;
}
}
for (j = 0; j < n; j++)
{
if (a[j] == 0)
{
if (b[j] != -1)
{
if (f[j]<f[out]||(f[j]==f[out]&&b[j] < b[out]))
out = j;
}
}
}
if (ne == out) //路断了,停在某点则停止循环
break;
a[out] = 1; //选中该点
ne = out; //该点作为下一轮循环的起点
}
for (i = 1; i < n; i++)
printf("%ld\n", b[i]);
free(a);
free(b);
free(f);
}
return 0;
}
我使用的是dijkstra算法,跪求大神指点错误,谢谢
相关推荐
2026安卓开发从零实战指南:环境搭建、核心基础与避坑干货(适配新版Android_Studio).pdf
2026安卓开发从零实战指南:环境搭建、核心基础与避坑干货(适配新版Android_Studio).pdf
如何实现科研成果转化率的有效提升与技术市场精准对接?.docx
如何实现科研成果转化率的有效提升与技术市场精准对接?
基于PID控制的ABS汽车防抱死制动系统、车轮滑移率+最优滑移率Carsim和Simulink联合仿真(带参考文献)
内容概要:本文档系统研究了基于PID控制的ABS汽车防抱死制动系统,聚焦于车轮滑移率与最优滑移率的动态控制问题,采用Carsim与Simulink联合仿真平台构建高精度车辆动力学模型与控制系统。研究详细阐述了ABS的工作机理,通过设计PID控制器实时调节制动压力,确保车轮滑移率稳定在最优区间,从而最大化轮胎与路面间的摩擦力,提升制动效能与行车安全性。文档涵盖了完整的建模流程、控制策略设计、仿真验证方法及参数整定过程,并提供了详实的参考文献支持,增强了研究的可复现性与工程应用价值。; 适合人群:具备车辆工程、自动化或控制理论等相关专业背景,熟悉MATLAB/Simulink与Carsim仿真环境的研究生、科研人员及汽车行业技术研发工程师。; 使用场景及目标:①用于ABS控制算法的教学讲解与科研实验;②支撑车辆制动性能优化、主动安全系统开发等实际工程应用;③为相关学术论文撰写、课题复现与技术创新提供理论依据与技术参考。; 阅读建议:建议读者结合所提供的仿真模型与参考文献,逐步运行并调试代码,重点关注滑移率计算逻辑、PID参数整定方法及联合仿真的数据交互机制,同时可尝试引入模糊控制、自适应控制等先进算法进行对比分析,以深入掌握ABS系统的控制精髓与优化路径。
高校如何利用技术转移数据分析优化成果转化路径?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
MATLAB采用改进的PSO实现AUV三维路径规划,配备自适应惯性权重、距离演化因子和跳出机制。.zip
MATLAB采用改进的PSO实现AUV三维路径规划,配备自适应惯性权重、距离演化因子和跳出机制。.zip


