80分求助 #5WA + #6TLE
查看原帖
80分求助 #5WA + #6TLE
384064
kevin985楼主2022/1/21 11:57
#include <bits/stdc++.h>
#define N 100013
#define int long long
#define re register
#define INF 0x7f7f7f7f
using namespace std;
int n,m;
struct Edge{
	int to,w,nxt;
}edge[N << 1];
int nbs[N],cnt;
inline void add(int u,int v,int w)
{
	edge[++cnt].to = v;
	edge[cnt].w = w;
	edge[cnt].nxt = nbs[u];
	nbs[u] = cnt;
}
int dis[N],tot[N];
bool vis[N];
queue<int>q;
inline bool spfa(int s)
{
	fill(dis + 1,dis + n + 1,-INF);
	memset(tot,0,sizeof tot);
	memset(vis,0,sizeof vis);
	dis[s] = 0; tot[s] = 1; vis[s] = 1;
	q.push(s);
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		vis[u] = 0;
		if(++tot[u] == n) return false;
		for(re int i=nbs[u];i;i=edge[i].nxt)
		{
			int to = edge[i].to,w = edge[i].w;
			if(dis[u] + w > dis[to])
			{
				dis[to] = dis[u] + w;
				if(!vis[to])
				{
					vis[to] = 1,q.push(to);
				}
			}
		}
	}
	return true;
}
signed main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	scanf("%d%d",&n,&m);
	for(re int i=1;i<=n;++i) add(0,i,1);
	for(re int i=1;i<=m;++i)
	{
		int x,a,b;
		scanf("%d%d%d",&x,&a,&b);
		if(a == b) continue;
		if(x == 1) add(a,b,0),add(b,a,0);//dis[b] <= dis[a] + 0,dis[a] <= dis[b] + 0;
		if(x == 2)
		{
			if(a == b) return !printf("-1");
			add(a,b,1);
		}//dis[a] <= dis[b] - 1
		if(x == 3) add(b,a,0);//dis[b] <= dis[a] + 0
		if(x == 4){
			if(a == b) return !printf("-1");
			add(b,a,1);
		}//dis[b] <= dis[a] - 1
		if(x == 5) add(a,b,0);//dis[a] <= dis[b] + 0;
	}
	if(!spfa(0)) printf("-1");
	else{
		int ans = 0;
		for(re int i=1;i<=n;++i) ans += dis[i];
		printf("%lld",ans);
	}
	return 0;
}
2022/1/21 11:57
加载中...