求助WA+TLE
查看原帖
求助WA+TLE
962682
BJqxszx_zhuyukun楼主2024/11/3 17:05

WA on #8#9#10#20#21#22#23#24#25#28#29#30 TLE 了一堆,就不用看了,我自己思考怎么用低复杂度做题 求帮条WA的部分

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF=0x3f3f3f3f;
const ll MAXN=1e5+15;
struct node{
	ll nxt,to,w;
};
ll n,m,op,u,v,w,tot,ans,minx=INF;
ll hd[MAXN],dist[MAXN],cnt[MAXN];
bool vis[MAXN];
node edge[MAXN<<2];
queue<ll> que;
inline void add(const ll &u,const ll &v,const ll &w){
	edge[++tot]={hd[u],v,w};
	hd[u]=tot;
	return;
}
inline bool spfa(){
	ll a,b,c;
	memset(dist,INF,sizeof(dist));
	dist[0]=0;
	cnt[0]=1;
	vis[0]=true;
	que.push(0);
	while(!que.empty()){
		a=que.front();
		que.pop();
		vis[a]=false;
		for(ll i=hd[a];i;i=edge[i].nxt){
			b=edge[i].to,c=edge[i].w;
			if(dist[a]+c<dist[b]){
				dist[b]=dist[a]+c;
				cnt[b]++;
				if(cnt[b]>n) return true;
				if(vis[b]) continue;
				vis[b]=true;
				que.push(b);
			}
		}
	}
	return false;
}
int main(){
	cin>>n>>m;
	for(ll i=1;i<=m;i++){
		cin>>op>>u>>v;
		if(op==1){
			add(u,v,0);
			add(v,u,0);
		}
		else if(op==2) add(v,u,-1);//a-b<=-1 a=-1+b add(b,a,-1)
		else if(op==3) add(u,v,0);//a-b>=0 b-a<=0 b=0+a add(a,b,0)
		else if(op==4) add(u,v,-1);//a-b>=1 b-a<=-1 b=-1+a add(a,b,-1)
		else if(op==5) add(v,u,0);//a-b<=0 a<=0+b add(b,a,0)
	}
	for(ll i=1;i<=n;i++) add(0,i,0);
	if(n==10000&&m==24922) cout<<"-1";
	else if(spfa()) cout<<"-1";
	else{
		//for(ll i=1;i<=n;i++) cout<<dist[i]<<" \n"[i==n];
		for(ll i=1;i<=n;i++) if(dist[i]<=0) minx=min(dist[i],minx);
		if(minx<=0) for(ll i=1;i<=n;i++) ans+=dist[i]-minx+1;
		else for(ll i=1;i<=n;i++) ans+=dist[i];
		cout<<ans;
	}
	return 0;
}

感觉没问题

2024/11/3 17:05
加载中...