求助大佬们
查看原帖
求助大佬们
315205
Kniqht楼主2022/10/15 11:48
这是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,接下来怎么改呢?谢谢大佬!

2022/10/15 11:48
加载中...