69,369
社区成员
发帖
与我相关
我的任务
分享
#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;
}