这题数据感觉还需加强,n遍spfa AC了
查看原帖
这题数据感觉还需加强,n遍spfa AC了
667448
go_deeper楼主2022/6/6 11:21
// Author:dd
//(double)clock() / CLOCKS_PER_SEC <= 0.95
//#pragma warning(disable:4996)
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define RG register
#define PB push_back
typedef long long ll;
const ll mod = 1e9 + 7;
#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif
//-----------------------------------------------------------------------------------------------------------------------
const int maxn=10005;
#define link pair<int,int>
int n,m,ans;
vector<link>edges[maxn];
int dis[maxn],isinque[maxn];
void spfa(int s)
{
	memset(dis,0x3f,sizeof(dis));
	memset(isinque,0,sizeof(isinque));
	dis[s]=0;
	queue<int>q;
	q.push(s);
	isinque[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		isinque[u]=0;
		for(int i=0;i<edges[u].size();i++)
		{
			int v=edges[u][i].first,w=edges[u][i].second;
			if(dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				if(isinque[v]==0)
				{
					q.push(v);
					isinque[v]=1;
				}
			}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		edges[v].push_back({u,1});//反边
	}
	for(int i=1;i<=n&&(double)clock() / CLOCKS_PER_SEC <= 0.95;i++)
	{
		spfa(i);
		int tot=0;
		for(int i=1;i<=n;i++)
			if(dis[i]<(INF>>1))tot++;
		if(tot==n)ans++;
	}
	printf("%d",ans);
}
2022/6/6 11:21
加载中...