ACM_Bellman-fordアルゴリズム
2134 ワード
Bellman_fordアルゴリズム:単一ソースを求める最短パスでもあり、Dijkstraアルゴリズムとの違いは、負の重み値エッジの存在をチェックできることです.負の重み値のエッジがあれば、最短パスは存在しません.1つの数+負の数で、必ず小さくなるので、dis配列は更新されます.
#include
#include
using namespace std;
#define INF 9999999
struct node
{
int u,v,w;
};// ,u,v,w
struct node a[109];
int n,m,dis[109],t;//n ,m ,dis[i] s i
bool bellman_ford(int s)// s
{
int i,j;
bool flag = true;//bool ,
dis[s] = 0;// 0, , ,
//dis
for (i = 1; i <= n-1; ++i)// , for ,
// , n , n-1 , n-1 OK
{
for (j = 1; j <= 2*m; ++j)//m , , 2m
{
if (dis[a[j].u] > dis[a[j].v] + a[j].w)// dis[s]=0,dis
dis[a[j].u] = dis[a[j].v] + a[j].w;
}
}
for (j = 1; j <= 2*m; ++j)
{
if (dis[a[j].u] > dis[a[j].v] + a[j].w)// + , , ,
// ,
{
flag = false;
break;
}
}
return flag;
}
int main()
{
int i,j,s,d,u,v,w;
while (~scanf("%d%d",&n,&m))
{
for (i = 1; i <= n; ++i)
dis[i] = INF;
j = 1;
t = m;
while (t--)
{
scanf("%d%d%d",&u,&v,&w);
a[j].u = u;
a[j].v = v;
a[j++].w = w;
a[j].u = v;
a[j].v = u;
a[j++].w = w;
}// ,
scanf("%d%d",&s,&d);//s ,d
if (bellman_ford(s))
printf("%d
",dis[d]);
else
printf("sorry
");
}
return 0;
}
/*
! , ,
(1) (2)
5 7 4 4
1 2 100 1 2 -9
1 5 10 2 3 1
1 3 30 3 4 2
2 3 60 4 1 3
2 4 10 1 2
3 4 60 (sorry)
4 5 50
1 4
(60)
!
*/