Qusetion Link
Problem analysising
Just try to find the negative edge.
Here are AC code (Bellman-Ford)
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std;
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val) memset(var,val,sizeof(var))
#define LL long long
#define eps 0.000001
#define inf 0x3f3f3f3f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x) rand()%(x)
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
while ( a>='0' && a<='9' ){ x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 509
struct node{
int u,v,w;
}e[N*N];int tot = 0; int n,m,w;int dis[N];
void add_ead(int u,int v,int w){
++tot;
e[tot].u = u; e[tot].v = v; e[tot].w = w;
}
void init(){
mset(dis,0x3f);
tot = 0;
}
bool bel(){
dis[1] = 0;
for (int ai = 1; ai <= n-1; ai++){
for (int bi = 1; bi <= tot; bi++){
int u,v,w;
u = e[bi].u ; v = e[bi].v ; w = e[bi].w;
if ( dis[v] > dis[u] + w )
dis[v] = dis[u] + w;
}
}
for (int bi = 1; bi <= tot; bi++){
if ( dis[ e[bi].v ] > dis[ e[bi].u ] + e[bi].w )
return 1;
}
return 0;
}
int main()
{
// freopen("1.txt","r",stdin);
srand((int)time(0));
// std::ios::sync_with_stdio(false);
int T; T = read();
rep(aaai,1,T){
init();
n = read(); m = read(); w = read();
rep(i,1,m){
int u,v,w;
u = read(); v = read(); w = read();
add_ead(u,v,w);
add_ead(v,u,w);
}
rep(i,1,w){
int u,v,w;
u = read(); v = read(); w = read();
add_ead(u,v,-w);
}
if ( bel() )
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
What is more
You can use a bool variable to accelerate the program.
bool bel(){
dis[1] = 0;
bool check = 0;
for (int ai = 1; ai <= n-1; ai++){
check = 0;
for (int bi = 1; bi <= tot; bi++){
int u,v,w;
u = e[bi].u ; v = e[bi].v ; w = e[bi].w;
if ( dis[v] > dis[u] + w )
dis[v] = dis[u] + w, check = 1;
}
if ( !check )
break;
}
for (int bi = 1; bi <= tot; bi++){
if ( dis[ e[bi].v ] > dis[ e[bi].u ] + e[bi].w )
return 1;
}
return 0;
}
Here are AC code (SPFA)
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std;
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val) memset(var,val,sizeof(var))
#define LL long long
#define eps 0.000001
#define inf 0x3f3f3f3f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x) rand()%(x)
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
while ( a>='0' && a<='9' ){ x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 509
struct node{
int u,v,w,nx;
}e[N*N];int tot = 0; int n,m,w;int dis[N],hea[N],num[N];bool inq[N];
void add_ead(int u,int v,int w){
++tot;
e[tot].u = u; e[tot].v = v; e[tot].w = w; e[tot].nx = hea[u]; hea[u] = tot;
}
void init(){
mset(dis,0x3f);
mset(hea,0);mset(num,0);
mset(inq,0);
tot = 0;
}
bool SPFA(){
queue< int > q;
dis[1] = 0; inq[1] = 1; num[1]++;
q.push(1);
while ( !q.empty() ){
int u = q.front(); q.pop(); inq[u] = 0;
for (int i = hea[u] ; i ;i = e[i].nx ){
if ( dis[ e[i].v ] > dis[ e[i].u ] + e[i].w ){
dis[ e[i].v ] = dis[ e[i].u ] + e[i].w;
if ( inq[ e[i].v ] == 0 ){
inq[ e[i].v ] = 1;
num[ e[i].v ]++;
q.push( e[i].v );
if ( num[ e[i].v ] > n )
return true;
}
}
}
}
return false;
}
int main()
{
// freopen("1.txt","r",stdin);
srand((int)time(0));
// std::ios::sync_with_stdio(false);
int T; T = read();
rep(aaai,1,T){
init();
n = read(); m = read(); w = read();
rep(i,1,m){
int u,v,w;
u = read(); v = read(); w = read();
add_ead(u,v,w);
add_ead(v,u,w);
}
rep(i,1,w){
int u,v,w;
u = read(); v = read(); w = read();
add_ead(u,v,-w);
}
if ( SPFA() )
printf("YES\n");
else
printf("NO\n");
}
return 0;
}