01bfs 80pts TLE + WA求调
查看原帖
01bfs 80pts TLE + WA求调
667558
_Kamisato_Ayaka_楼主2024/10/22 16:05
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2e5 + 10;
int n,k,idx = 1;
int head[MAXN << 1],dis[MAXN << 1],cnt[MAXN << 1];
bool vis[MAXN << 1];
struct node{
	int v,w,nxt;
}edge[MAXN << 1];
inline void add(int u,int v,int w)
{
	edge[idx].v = v;
	edge[idx].w = w;
	edge[idx].nxt = head[u];
	head[u] = idx ++;
}
inline void bfs(int s)
{
	memset(dis,0,sizeof(dis));
	deque<int>q;
	dis[s] = 1;
	q.push_back(s);
	while(!q.empty())
	{
		int u = q.front();
		q.pop_front();
		vis[u] = 0;
		for(int i = head[u];i;i = edge[i].nxt)
		{
			int v = edge[i].v,w = edge[i].w;
			if(dis[v] < dis[u] + w)
			{
				dis[v] = dis[u] + w;
				if(!vis[v])
				{
					vis[v] = 1;
					cnt[v] = cnt[u] + 1;
					if(cnt[v] >= n)
					{
						printf("-1\n");
						exit(0);
					}
					if(w) q.push_back(v);
					else q.push_front(v);
				}
			}
		}
	}
}
signed main()
{
	scanf("%lld %lld",&n,&k);
	for(int i = 1;i <= n;i ++)
	{
		int x,u,v;
		scanf("%lld %lld %lld",&x,&u,&v);
		if(x == 1)
			add(u,v,0),add(v,u,0);
		if(x == 2)
		{
			if(u == v)
			{
				printf("-1\n");
				return 0;
			}
			add(u,v,1);
		}
		if(x == 3)
			add(v,u,0);
		if(x == 4)
		{
			if(u == v)
			{
				printf("-1\n");
				return 0;
			}
			add(v,u,1);
		}
		if(x == 5)
			add(u,v,0);
	}
	for(int i = 1;i <= n;i ++) add(0,i,0);
	bfs(0);
	int Ans = 0;
	for(int i = 1;i <= n;i ++)
		Ans += dis[i];
	printf("%lld\n",Ans);
	return 0;
}
2024/10/22 16:05
加载中...