**
1.题意:
**
- 在探索他的许多农场,农场主约翰发现了一些惊人的虫洞。虫洞非常特殊,因为它是一种单向路径送你到目的地之前进入虫洞!每个FJ农场由N (1≤N≤500)字段方便编号1 . .N, M(1≤≤2500)路径,和W W(1≤≤200)虫洞。 FJ穿越时光的狂热粉丝,他想做以下几点:开始在一些领域,通过一些路径和虫洞旅行,回到起始时间他最初的离开。也许他将能够满足自己:)。 帮助FJ找出是否这是可能的,他将为你提供完整的映射到F (F 1≤≤5)他的农场。没有路径将超过10000秒,没有虫洞旅行可以带回FJ时间超过10000秒。
- 输入
1:第一行t祖测试数据
2:第二行 N:n个农场,M:M个双向边,W:W个虫洞
3:后面
M行双向边信息,A->B:Value,B->A:Value;
W行虫洞信息,A->B:-Value(题目输入的是正数),这里是多重边;
2.代码
- bellmanford()
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
struct node{
int s, e, v;
node(int a, int b, int c){
s = a, e = b, v = c;
}
};
const int inf = 1 << 30;
vector<node> edge;
int n;
int dis[1000];
bool bellmanford(){
bool flag;
for(int i = 0; i <= n; i++){
dis[i] = inf;
}
dis[1] = 0;
for(int k = 1; k <= n; k++){
flag = false;
for(int i = 0; i < edge.size(); i++){
node node = edge[i];
if(dis[node.s] + node.v < dis[node.e]){
dis[node.e] = dis[node.s] + node.v;
flag = true;
}
}
if(!flag) break;
}
return flag;
}
int main(){
int t, m, w;
int s, e, v;
cin >> t;
while(t--){
cin >> n >> m >> w;
edge.clear();
while(m--){
cin >> s >> e >> v;
edge.push_back(node(s, e, v));
edge.push_back(node(e, s, v));
}
while(w--){
cin >> s >> e >> v;
edge.push_back(node(s, e, -v));
}
if(bellmanford()) cout << "YES" <<endl;
else cout << "NO" << endl;
}
return 0;
}
2.SPFA()
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
struct node{
int e, v;
node( int b, int c){
e = b, v = c;
}
};
const int inf = 0x3f3f3f3f;
vector<node> edge[1000];
int n;
int dis[1000];
int num[1000];
bool vis[1000];
bool SPAF(){
memset(num, 0, sizeof(num));
memset(vis, false, sizeof(vis));
memset(dis, inf, sizeof(dis));
dis[1] = 0;
vis[1] = true;
// num[1] ++;
queue<int> Q;
Q.push(1);
while(!Q.empty()){
int u = Q.front();
Q.pop();
vis[u] = false;
for(int i = 0; i < edge[u].size(); i++){
int e = edge[u][i].e;
int v = edge[u][i].v;
if(dis[e] > dis[u] + v){
dis[e] = dis[u] + v;
if(!vis[e]){
Q.push(e);
vis[e] = true;
num[e] ++;
if(num[e] > n) return true;
}
}
}
}
return false;
}
int main(){
int t, m, w;
int s, e, v;
cin >> t;
while(t--){
cin >> n >> m >> w;
for(int i = 0; i <= n; i++){
edge[i].clear();//vector记得清空 wa尼玛
}
while(m--){
cin >> s >> e >> v;
edge[s].push_back(node(e, v));
edge[e].push_back(node(s, v));
}
while(w--){
cin >> s >> e >> v;
edge[s].push_back(node(e, -v));
}
if(SPAF()) cout << "YES" <<endl;
else cout << "NO" << endl;
}
return 0;
}