-
- 学习学习,特别是SPFA
#include
<
cstdio
>
#include
<
cstring
>
using namespace std;

#define MAXN
100
long
f[MAXN
+
1
][MAXN
+
1
];
long
n;
long
from,to;
const long maxn = 214748364
;

void
ini(
void
)

{
freopen(
"
shortpath.in
"
,
"
r
"
,stdin);
freopen(
"
shortpath.out
"
,
"
w
"
,stdout);
memset(f,
0
,sizeof(f));
scanf(
"
%ld
"
,
&
n);
long
i, j;
for
(i
=
1
; i
<=
n; i
++
)
for
(j
=
1
; j
<=
n; j
++
)
scanf(
"
%ld
"
,
&
f[i][j]);
scanf(
"
%ld %ld
"
,
&
from,
&
to);
return
;
}
long
dijkstra(
void
)

{
long
dist[MAXN
+
1
];
bool flag[MAXN
+
1
];
long
i, j;
long
mins, mini;
memset(dist,
0
, sizeof(dist));
memset(flag,
0
, sizeof(flag));
for
(i
=
1
; i
<=
n; i
++
)

{
dist[i]
=
maxn;
if
(f[from][i]
!=
0
)
dist[i]
=
f[from][i];
}
dist[from]
=
0
;
flag[from]
=
true
;
for
(i
=
1
; i
<
n; i
++
)

{
mins
=
maxn;
for
(j
=
1
; j
<=
n; j
++
)
if
(dist[j]
<
mins
&&
!
flag[j])

{
mins
=
dist[j];
mini
=
j;
}
flag[mini]
= true
;
for
(j
=
1
;j
<=
n;j
++
)
if
(dist[j]
>
dist[mini]
+
f[mini][j]
&&
f[mini][j]
!=
0
)
dist[j]
=
dist[mini]
+
f[mini][j];
}
return
dist[to];
}
long
spfa(
void
)

{
long
q[
3
*
MAXN
+
1
];
long
head, tail;
long
dist[MAXN
+
1
];
long
flag[MAXN
+
1
];
memset(q,
0
, sizeof(q));
memset(dist,
0
, sizeof(dist));
memset(flag,
0
, sizeof(flag));
memset(flag,
0
, sizeof(flag));
long
i, j;
head
=
0
; tail
=
0
;
tail
++
;
q[tail]
=
from;
flag[from]
=
true
;
long
now, tt;
for
(i
=
1
; i
<=
n; i
++
)
dist[i]
=
maxn;
dist[from]
=
0
;
while
(head
<
tail)

{
head
++
;
now
=
q[head];
flag[now]
=
false
;
for
(i
=
1
; i
<=
n; i
++
)
if
(f[now][i])

{
if
(dist[i]
>
dist[now]
+
f[now][i])

{
dist[i]
=
dist[now]
+
f[now][i];
if
(
!
flag[i])

{
flag[i]
=
true
;
tail
++
;
q[tail]
=
i;
}
}
}
}
return
dist[to];
}
long
floyd(
void
)

{
long
i, j, k;
long
dist[MAXN
+
1
][MAXN
+
1
];
for
(i
=
1
; i
<=
n; i
++
)
for
(j
=
1
; j
<=
n; j
++
)
if
(f[i][j]
!=
0
)
dist[i][j]
=
f[i][j];
else
dist[i][j]
=
maxn;
for
(k
=
1
; k
<=
n; k
++
)
for
(i
=
1
; i
<=
n; i
++
)
for
(j
=
1
; j
<=
n; j
++
)
if
(dist[i][j]
>
dist[i][k]
+
dist[k][j])
dist[i][j]
=
dist[i][k]
+
dist[k][j];
return
dist[from][to];
}
int
main(
void
)

{
ini();
printf(
"
%ld\n
"
, dijkstra());
printf(
"
%ld\n
"
, spfa());
printf(
"
%ld\n
"
, floyd());
return
0
;
}
|
|
| | 日 | 一 | 二 | 三 | 四 | 五 | 六 |
|---|
| 31 | 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 | 1 | 2 | 3 | 4 | | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
|
常用链接
留言簿
文章分类
文章档案
搜索
最新评论

|
|