1、题目类型:图论、最短路径、Bellman-Ford算法。
2、解题思路:(1)根据输入记录所有的边,其中无向边转换为有向边记录;(2)Bellman-Ford算法松弛所有的边,寻找是否存在负圈。
3、注意事项:注意Mov[]数组的大小。
4、实现方法:
#include
<
iostream
>
using namespace std;
#define Maxn 510
#define Maxw 6000
#define INF 99999
struct TMove{
int s,e,t;
};
TMove Mov[Maxw];
int n,m,w,flag,cnt;
void Bellman_ford()
{
int i,j,start,end,time;
double d[Maxn];
for (i = 0 ;i < n;i ++ )
d[i] = INF;
d[ 0 ] = 0 ;
for (i = 1 ;i < n;i ++ )
{
for (j = 0 ;j < cnt;j ++ )
{
start = Mov[j].s;
end = Mov[j].e;
time = Mov[j].t;
if (d[end] > d[start] + time)
d[end] = d[start] + time;
}
}
for (j = 0 ;j < cnt;j ++ )
{
start = Mov[j].s;
end = Mov[j].e;
time = Mov[j].t;
if (d[end] > d[start] + time)
{
flag = 1 ;
return ;
}
}
}
int main()
{
int i,f,s,e,t;
cin >> f;
while (f -- )
{
cin >> n >> m >> w;
memset(Mov, 0 , sizeof (Mov));
flag = 0 ,cnt = 0 ;
for (i = 0 ;i < m;i ++ )
{
cin >> s >> e >> t;
s -- ,e -- ;
Mov[cnt].s = s;
Mov[cnt].e = e;
Mov[cnt].t = t;
cnt ++ ;
Mov[cnt].s = e;
Mov[cnt].e = s;
Mov[cnt].t = t;
cnt ++ ;
}
for (i = 0 ;i < w;i ++ )
{
cin >> s >> e >> t;
s -- ,e -- ;
Mov[cnt].s = s;
Mov[cnt].e = e;
Mov[cnt].t =- t;
cnt ++ ;
}
Bellman_ford();
if (flag)
cout << " YES " << endl;
else
cout << " NO " << endl;
}
return 1 ;
}
using namespace std;
#define Maxn 510
#define Maxw 6000
#define INF 99999
struct TMove{
int s,e,t;
};
TMove Mov[Maxw];
int n,m,w,flag,cnt;
void Bellman_ford()
{
int i,j,start,end,time;
double d[Maxn];
for (i = 0 ;i < n;i ++ )
d[i] = INF;
d[ 0 ] = 0 ;
for (i = 1 ;i < n;i ++ )
{
for (j = 0 ;j < cnt;j ++ )
{
start = Mov[j].s;
end = Mov[j].e;
time = Mov[j].t;
if (d[end] > d[start] + time)
d[end] = d[start] + time;
}
}
for (j = 0 ;j < cnt;j ++ )
{
start = Mov[j].s;
end = Mov[j].e;
time = Mov[j].t;
if (d[end] > d[start] + time)
{
flag = 1 ;
return ;
}
}
}
int main()
{
int i,f,s,e,t;
cin >> f;
while (f -- )
{
cin >> n >> m >> w;
memset(Mov, 0 , sizeof (Mov));
flag = 0 ,cnt = 0 ;
for (i = 0 ;i < m;i ++ )
{
cin >> s >> e >> t;
s -- ,e -- ;
Mov[cnt].s = s;
Mov[cnt].e = e;
Mov[cnt].t = t;
cnt ++ ;
Mov[cnt].s = e;
Mov[cnt].e = s;
Mov[cnt].t = t;
cnt ++ ;
}
for (i = 0 ;i < w;i ++ )
{
cin >> s >> e >> t;
s -- ,e -- ;
Mov[cnt].s = s;
Mov[cnt].e = e;
Mov[cnt].t =- t;
cnt ++ ;
}
Bellman_ford();
if (flag)
cout << " YES " << endl;
else
cout << " NO " << endl;
}
return 1 ;
}