spfa。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int inf = 1e9;
int F;
int N, M, W;
int S, E, T;
struct Edge
{
int v, next;
int t;
} e[5205];
int head[505], Count;
int d[505];
int n[505];
bool visited[505];
void add(int u, int v, int t)
{
e[Count].v = v;
e[Count].t = t;
e[Count].next = head[u];
head[u] = Count ++;
}
bool spfa()
{
queue<int> Q;
d[1] = 0;
Q.push(1);
visited[1] = true;
n[1] ++;
int p, q;
while(Q.size())
{
p = Q.front();
Q.pop();
visited[p] = false;
for(int i = head[p]; i != -1; i = e[i].next)
{
q = e[i].v;
if(d[q] > d[p] + e[i].t)
{
d[q] = d[p] + e[i].t;
if(!visited[q])
{
Q.push(q);
visited[q] = true;
n[q] ++;
if(n[q] > N)
return true;
}
}
}
}
return false;
}
int main()
{
cin >> F;
while(F --)
{
memset(head, -1, sizeof(head));
Count = 0;
for(int i = 0; i < 505; i ++)
d[i] = inf;
memset(n, 0, sizeof(n));
memset(visited, false, sizeof(visited));
cin >> N >> M >> W;
for(int i = 0; i < M; i ++)
{
cin >> S >> E >> T;
add(S, E, T);
add(E, S, T);
}
for(int i = 0; i < W; i ++)
{
cin >> S >> E >> T;
add(S, E, -T);
}
if(spfa())
cout << "YES" << endl;
else
cout << "NO" << endl;
}
// system("pause");
return 0;
}