这是50pts代码
#include<bits/stdc++.h>
using namespace std;
const int N=3010,M=1e5+10;
int n,m,k,s;
int h[M],w[N],e[M],ne[M],idx;
int d[N],q[N],cnt[N],dist[N];
bool flag,st[N];
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;}
void SPFA(){
memset(dist,0x3f,sizeof(dist));
memset(cnt,0,sizeof(cnt));
int hh=0,tt=-1;
for(int i=1;i<=s;i++) q[++tt]=i,st[i]=true;
dist[s]=0;cnt[s]=flag=1;
while(hh<=tt){
int t=q[hh++];st[t]=false;
if(cnt[t]>=s-1){flag=0;return;}
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
if(dist[j]>dist[t]+w[i]){
dist[j]=dist[t]+w[i];
if(!st[j]){cnt[j]=cnt[t]+1;q[++tt]=j;st[j]=true;}
}
}
}
}
int main(){
int T,x,y,z;scanf("%d",&T);
while(T--){
memset(st,0,sizeof(st));
memset(h,-1,sizeof(h));idx=0;
scanf("%d%d%d",&n,&m,&k);
while(k--){
scanf("%d%d%d",&x,&y,&z);
add(x,y+n,z);add(y+n,x,-z);
}
for(int i=1;i<=n+m;i++) add(n+m+1,i,0);
s=n+m+1;SPFA();
if(!flag) printf("No\n");
else printf("Yes\n");
}
return 0;
}
这样是70pts
#include<bits/stdc++.h>
using namespace std;
const int N=5010,M=1e6+10;
int n,m,k,s;
int h[M],w[N],e[M],ne[M],idx;
int d[N],q[N],cnt[N],dist[N];
bool flag,st[N];
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;}
void SPFA(){
memset(dist,0x3f,sizeof(dist));
memset(cnt,0,sizeof(cnt));
int hh=0,tt=-1;
q[++tt]=s;st[s]=true;
dist[s]=0;cnt[s]=flag=1;
while(hh<=tt){
int t=q[hh++];st[t]=false;
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
if(dist[j]>dist[t]+w[i]){
if(cnt[j]>=n+m){flag=false;return;}
dist[j]=dist[t]+w[i];
if(!st[j]){cnt[j]++;q[++tt]=j;st[j]=true;}
}
}
}
}
int main(){
int T,x,y,z;scanf("%d",&T);
while(T--){
memset(st,0,sizeof(st));
memset(h,-1,sizeof(h));idx=0;
scanf("%d%d%d",&n,&m,&k);
while(k--){
scanf("%d%d%d",&x,&y,&z);
add(x,y+n,z);add(y+n,x,-z);
}
for(int i=1;i<=n+m;i++) add(n+m+1,i,0);
s=n+m+1;SPFA();
if(!flag) printf("No\n");
else printf("Yes\n");
}
return 0;
}
//看了看第一篇题解
请问这两种做法有什么区别呢为什么第一种就是50pts,接下来怎么改呢?谢谢大佬!