P3275求调
  • 板块学术版
  • 楼主_Kamisato_Ayaka_
  • 当前回复0
  • 已保存回复1
  • 发布时间2024/10/22 17:01
  • 上次更新2024/10/22 19:22:03
查看原帖
P3275求调
667558
_Kamisato_Ayaka_楼主2024/10/22 17:01

https://www.luogu.com.cn/discuss/969457 (01bfs)

(这是spfa Unaccepted 100pts)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2e5 + 10;
int n,k,idx = 1,tot;
int head[MAXN],dis[MAXN],cnt[MAXN];
bool vis[MAXN];
struct node{
	int v,w,nxt;
}edge[MAXN];
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 spfa(int s)
{
	queue<int>q;
	for(int i = 1;i <= n;i ++)
	{
		dis[i] = 1;
		vis[i] = 1;
		q.push(i);
	}
	int tot = 0;
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		vis[u] = 0;
		tot ++;
		if(tot >= 2e7)
		{
			cout << "-1" << endl;
			exit(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])
				{
					cnt[v] ++;
					if(cnt[v] > n)
					{
						cout << "-1" << endl;
						exit(0);
					}
					vis[v] = 1;
					q.push(v);
				}
			}
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> k;
	for(int i = 1;i <= k;i ++)
	{
		int x,u,v;
		cin >> x >> u >> v;
		if(x == 1)
		{
			add(u,v,0);
			add(v,u,0);
		}
		if(x == 2)
		{
			if(u == v)
			{
				cout << "-1" << endl;
				return 0;
			}
			add(u,v,1);
		}
		if(x == 3)
			add(v,u,0);
		if(x == 4)
		{
			if(u == v)
			{
				cout << "-1" << endl;
				return 0;
			}
			add(v,u,1);
		}
		if(x == 5)
			add(u,v,0);
	}
	for(int i = 1;i <= n;i ++) add(0,i,0);
	spfa(0);
	int Ans = 0;
	for(int i = 1;i <= n;i ++) Ans += dis[i];
	cout << Ans << endl;
	return 0;
}
2024/10/22 17:01
加载中...