九度oj 1100 一直wa,实在找不出错在哪,求大神指教(dijkstra算法)

haroroda 2017-03-11 03:44:48
题目描述:
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算法,跪求大神指点错误,谢谢
...全文
184 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-13
  • 打赏
  • 举报
回复
百度搜相关关键字。
haroroda 2017-03-12
  • 打赏
  • 举报
回复
自己顶,求不沉
haroroda 2017-03-11
  • 打赏
  • 举报
回复
好的,我再发一个
自信男孩 2017-03-11
  • 打赏
  • 举报
回复
建议: 1. 将代码细分,可以根据功能分成不同函数处理。把所有的操作写在一起,容易分不清逻辑; 2. 建议放到C++专栏里

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧