Bzoj1051 haoi2006 受欢迎的牛

42 篇文章 0 订阅
31 篇文章 0 订阅

比较基础的题目


首先边肯定是要反着加的

然后可以用tarjan一次求出来所有的scc

这个也就是缩点


然后看有几个点入度是0

这个点指得是强连通分量


如果入度为0 的点只有一个就直接把这个点的点数输出

否则输0


没了

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <stack>
#define MAX 50009
#define rep(i,j,k) for(int i = j; i <= k; i++)

using namespace std;

int to[2 * MAX], next[2 * MAX], head[MAX];
int SccNum = 0, DfsClock = 0, dfn[MAX], low[MAX], num[MAX], In[MAX], in[MAX];
int tot = 0, scc[MAX], n, m;

stack <int> s;

inline void add (int x, int y)
{
	to[++tot] = y;
	next[tot] = head[x];
	head[x] = tot;
}

void tarjan (int x)
{
	dfn[x] = low[x] = ++DfsClock;
	in[x] = 1;
	s.push (x);
	for (int i = head[x]; i; i = next[i])
		if (!dfn[to[i]])
		{
			tarjan (to[i]);
			low[x] = min (low[x], low[to[i]]);
		}
		else
			if (in[to[i]])
				low[x] = min (low[x], dfn[to[i]]);

	if (low[x] == dfn[x])
	{
		SccNum++;
		while (1)
		{
			num[SccNum]++;
			int now = s.top();
			s.pop ();
			in[now] = 0;
			scc[now] = SccNum;
			if (now == x)
				break;
		}
	}
}

int main()
{
	scanf ("%d%d", &n, &m);
	rep (i, 1, m)
	{
		int a1, a2;
		scanf ("%d%d", &a1, &a2);
		add (a2, a1);
	}
	rep (i, 1, n)
		if (!dfn[i])
			tarjan (i);

	rep (i, 1, n)
		for (int j = head[i]; j; j = next[j])
			if (scc[i] != scc[to[j]])
				In[scc[to[j]]]++;

//	rep (i, 1, SccNum)
//		printf ("%d-- %d\n", i, num[i]);

	int ans = 0, u = 0;
	rep (i, 1, SccNum)
		if (!In[i])
			ans = num[i], u++;
	if (u == 1)
		printf ("%d\n", ans);
	else
		printf ("0\n");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BZOJ 2908 题目是一个数据下载任务。这个任务要求下载指定的数据文件,并统计文件中小于等于给定整数的数字个数。 为了完成这个任务,首先需要选择一个合适的网址来下载文件。我们可以使用一个网络爬虫库,如Python中的Requests库,来帮助我们完成文件下载的操作。 首先,我们需要使用Requests库中的get()方法来访问目标网址,并将目标文件下载到我们的本地计算机中。可以使用以下代码实现文件下载: ```python import requests url = '目标文件的网址' response = requests.get(url) with open('本地保存文件的路径', 'wb') as file: file.write(response.content) ``` 下载完成后,我们可以使用Python内置的open()函数打开已下载的文件,并按行读取文件内容。可以使用以下代码实现文件内容读取: ```python count = 0 with open('本地保存文件的路径', 'r') as file: for line in file: # 在这里实现对每一行数据的判断 # 如果小于等于给定整数,count 加 1 # 否则,不进行任何操作 ``` 在每一行的处理过程中,我们可以使用split()方法将一行数据分割成多个字符串,并使用int()函数将其转换为整数。然后,我们可以将该整数与给定整数进行比较,以判断是否小于等于给定整数。 最后,我们可以将统计结果打印出来,以满足题目的要求。 综上所述,以上是关于解决 BZOJ 2908 数据下载任务的简要步骤和代码实现。 希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值