70pts求调,WAon后三个点
查看原帖
70pts求调,WAon后三个点
439609
封禁用户楼主2023/8/28 10:16
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int n,k,x,a,b,idx,h[N*2],dist[N],vis[N],num[N],ans;
struct Edge
{
	int v,next,w;
}edge[N*2];
void add(int x,int y,int z)
{
	edge[++idx].v=y;
	edge[idx].next=h[x];
	edge[idx].w=z;
	h[x]=idx;
}
void spfa(int x)
{
	queue<int> q;
	memset(vis,0,sizeof(vis));
	memset(dist,-0x3f,sizeof(dist));
	memset(num,0,sizeof(num));
	dist[x]=0;
	vis[x]=1;
	q.push(x);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=h[u];i;i=edge[i].next)
		{
			int j=edge[i].v,w=edge[i].w;
			if(dist[j]<dist[u]+w)
			{
				dist[j]=dist[u]+w;
				num[j]=num[u]+1;
				if(num[j]>n)
				{
					printf("-1");
					exit(0);
				}
				if(vis[j]==0)
				{
					q.push(j);
					vis[j]=1;
				}
			}
		}
	}
}
signed main()
{
	scanf("%lld%lld",&n,&k);
	for(int i=n;i>=1;i--) add(0,i,1);
	for(int i=1;i<=k;i++)
	{
		scanf("%lld%lld%lld",&x,&a,&b);
		if(x==1)
		{
			add(a,b,0);
			add(b,a,0);
		}
		if(x==2)
		{
			if(a==b)
			{
				printf("-1");
				return 0;
			}
			add(a,b,1);
		}
		if(x==3) add(b,a,0);
		if(x==4)
		{
			if(a==b)
			{
				printf("-1");
				return 0;
			}
			add(b,a,1);
		}
		if(x==5) (a,b,0);
	}
	spfa(0);
	for(int i=1;i<=n;i++) ans+=dist[i];
	printf("%lld",ans);
	return 0;
}
2023/8/28 10:16
加载中...