理解了很久才知道建立负边判负环
大概是真真正正写的第一道图论题
前前后后写了两课
WA TLE RE CE 全部全了
刚知道poj上不能交万能头文件
luogu过一个点 poj CE
本以为以及注意了赋初值的问题了
事实上考虑的还是不全
赋初值 状态更换 真的特别特别重要
之前写题目
过了样例就很开心
提交之后也只能A一个点
编程真的需要非常缜密的思维
差一点点都不行
暴力写不好真的是有原因的
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 501
#define maxm 10005
using namespace std;
template <typename T> void read(T &x){
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
x*=f;
}
int T,n,m,k;
int head[maxn],dis[maxn];
int nxt[maxm],to[maxm],wei[maxm];
bool vis[maxn];
int tim[maxn],Q[maxn*maxn];
int total;
void add(int u,int v,int w){
++total;
to[total]=v;
wei[total]=w;
nxt[total]=head[u];
head[u]=total;
}
bool spfa(int x){
memset(Q,0,sizeof(Q));
memset(dis,0x7f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(tim,0,sizeof(tim));
int f=0,t=1;
Q[1]=x;
dis[x]=0;
tim[x]=1;
while(f<t){
f++;
vis[Q[f]]=0;
for(int e=head[Q[f]];e;e=nxt[e]){
if(dis[to[e]]>dis[Q[f]]+wei[e]){
dis[to[e]]=dis[Q[f]]+wei[e];
if(++tim[to[e]]>n) return true;
if(!vis[to[e]]){
++t;
Q[t]=to[e];
vis[to[e]]=1;
}
}
}
}
return false;
}
int main(){
read(T);
while(T--){
read(n),read(m),read(k);
total=0;//赋初值 !
memset(head,0,sizeof(head));
memset(nxt,0,sizeof(nxt));
memset(wei,0,sizeof(wei));
memset(to,0,sizeof(to));
for(int i=1;i<=m;++i){
int u,v,w;
read(u),read(v),read(w);
add(u,v,w);
add(v,u,w);
}
for(int i=1;i<=k;++i){
int u,v,w;
read(u),read(v),read(w);
add(u,v,-w);
}
if(spfa(1)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}