#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std
;
#define INF 0x7FFFFFFF
typedef struct
{ int w
, adj
; }Arcnode
;
vector
<vector
<Arcnode
>> G
;
vector
<int > Path
, nPath
, Dist
, visited
, cnt
;
bool SPFA( int v
, int N
)
{
queue
<int > q
;
q
.push(v
);
visited
[v
] = 1;
++cnt
[v
];
while( !q
.empty() )
{
v
= q
.front();
q
.pop();
visited
[v
] = 0;
for( int i
= 0; i
< G
[v
].size(); ++i
)
if( Dist
[v
] != INF
&& Dist
[ G
[v
][i
].adj
] > Dist
[v
] + G
[v
][i
].w
)
{
Dist
[ G
[v
][i
].adj
] = Dist
[v
] + G
[v
][i
].w
;
nPath
[ G
[v
][i
].adj
] = nPath
[v
];
Path
[ G
[v
][i
].adj
] = v
;
if( !visited
[ G
[v
][i
].adj
] )
{
q
.push( G
[v
][i
].adj
);
visited
[ G
[v
][i
].adj
] = 1;
if( ++cnt
[ G
[v
][i
].adj
] >= N
)
return false;
}
}
else if( Dist
[v
] != INF
&& Dist
[ G
[v
][i
].adj
] == Dist
[v
] + G
[v
][i
].w
)
nPath
[ G
[v
][i
].adj
] += nPath
[v
];
}
return true;
}
int main()
{
int N
, M
, V1
, V2
, a
, b
, w
;
Arcnode temp
;
scanf("%d %d %d %d", &N
, &M
, &V1
, &V2
);
Path
.resize(N
);
Dist
.resize(N
);
nPath
.resize(N
);
visited
.resize(N
);
cnt
.resize(N
);
visited
.resize(N
);
G
.resize(N
);
fill( Dist
.begin(), Dist
.end(), INF
);
fill( Path
.begin(), Path
.end(), -1 );
Dist
[V1
] = 0;
nPath
[V1
] = 1;
for( int i
= 0; i
< M
; ++i
)
{
scanf("%d %d %d", &a
, &temp
.adj
, &temp
.w
);
G
[a
].push_back( temp
);
}
if( SPFA( V1
, N
) )
{
for( int i
= 0; i
< N
; ++i
)
printf("%d%s", Dist
[i
], i
== N
- 1 ? "\n":" ");
for( int i
= V2
; i
!= -1; i
= Path
[i
] )
printf("%d ", i
);
printf("\n%d", nPath
[V2
]);
}
}
测试用例:给点节点数与路径数, 给定任意两存在节点,输出最短距离,及最短路径
6 8 0 2
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
转载请注明原文地址: https://yun.8miu.com/read-28465.html