-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path18.c
95 lines (82 loc) · 1.63 KB
/
18.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*************************************************************************
> File Name: 18.c
> Author: qusijun
> Mail: wiilen.lian@gamil.com
> Created Time: 2014年05月26日 星期一 21时27分30秒
************************************************************************/
#include<stdio.h>
#include<limits.h>
#define MAXVER 130
#define MAXEDG 230
//typedef struct edge edge;
struct edge
{
int start;
int end;
int weight;
}Edges[MAXEDG];
int vers;
int edgs;
int pre[MAXVER];
int dis[MAXVER];
void init()
{
for(int i = 0;i<vers;i++)
{
dis[i] = INT_MAX;
pre[i] = -1;
}
for(int i = 0;i<edgs;i++)
{
if(Edges[i].start == 0)
{
dis[Edges[i].end] = Edges[i].weight;
pre[Edges[i].end] = 0;
}
}
dis[0] = 0;
}
void relax(int u,int v,int weight)
{
if(dis[u]+weight<dis[v])
{
dis[v] = dis[u]+weight;
pre[v] = u;
}
}
int Bellman_ford()
{
int flag = 1;
for(int i = 1;i<vers;i++)
{
for(int j = 0;j<edgs;j++)
{
relax(Edges[j].start,Edges[j].end,Edges[j].weight);
}
}
for(int i = 0;i<edgs;i++)
{
if(dis[Edges[i].start]+Edges[i].weight<dis[Edges[i].end])
flag = 0;
}
return flag;
}
int main(void)
{
//printf("%d",INT_MAX);
scanf("%d%d",&vers,&edgs);
for(int i = 0;i<edgs;i++)
{
scanf("%d%d%d",&Edges[i].start,&Edges[i].end,&Edges[i].weight);
}
init();
int result = Bellman_ford();
if(result)
{
for(int i = 0;i<vers;i++)
{
printf("%d,",dis[i]);
}
}
return 0;
}