奇怪的TLE
查看原帖
奇怪的TLE
117648
CasseroleGoose楼主2020/12/27 16:35

用的是spfa跑差分约束,然后出了#6 TLE,其他的运行效率都十分可观,求助QAQ

#include<bits/stdc++.h>
#define F(i,l,r) for(register int i=l;i<=r;i++)
#define D(i,r,l) for(register int i=r;i>=l;i--)
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define p_b push_back
#define m_p make_pair
#define il inline
#define fi first
#define se second
const int INF=0x7f7f7f7f,N=1e5+5;
using namespace std;
void rd(int &num) {
	char ch=getchar();
	num=0;
	int k=1;
	while((ch>'9'||ch<'0')&&ch!='-') ch=getchar();
	if(ch=='-') k=-1,ch=getchar();
	while(ch<='9'&&ch>='0') num=num*10+ch-'0',ch=getchar();
	num*=k;
}
int n,k;
int op,u,v,w;
int head[N];
struct node {
	int to,nxt,w;
}e[(N<<2)+N];
int ecnt;
void add(int u,int v,int w) {
	e[++ecnt].to=v;
	e[ecnt].nxt=head[u];
	e[ecnt].w=w;
	head[u]=ecnt;
}
bool in[N];
int dis[N],cnt[N];
int spfa(int x) {
	queue<int> q;
	q.push(x);in[x]=1;
	dis[x]=0;
	while(!q.empty()) {
		int u=q.front();q.pop();
		in[u]=0;
		for(int i=head[u];~i;i=e[i].nxt) {
			int to=e[i].to,w=e[i].w;
			if(dis[to]<dis[u]+w) {
				dis[to]=dis[u]+w;
				if(!in[to]) {
					in[to]=1;
					q.push(to);
					cnt[to]++;
					if(cnt[to]==n) return false;
				}
			}
		}
	}
	return 1;
}
int main() {
	mem(head,-1);
	rd(n),rd(k);
	F(i,1,k) {
		rd(op),rd(u),rd(v);
		if(op%2==0&&u==v) return puts("-1"),0;
		if(op==1) add(u,v,0),add(v,u,0);
		if(op==2) add(u,v,1);
		if(op==3) add(v,u,0);
		if(op==4) add(v,u,1);
		if(op==5) add(u,v,0);
	}
	F(i,1,n) add(0,i,1);
	if(!spfa(0)) return puts("-1"),0;
	ll ans=0;
	F(i,1,n) ans+=dis[i];
	printf("%lld\n",ans);
	return 0;
}
2020/12/27 16:35
加载中...