UVA 11770 Lighting Away

3 篇文章 0 订阅
1 篇文章 0 订阅

RunID

User

Problem

Result

Memory

Time

Language

Length

Submit Time

2482977

zhyfzy

J

Accepted

0 KB

138 ms

C++ 4.8.2

2322 B

2014-07-24 15:18:54

【题目大意】

一个有向图,每对一个结点操作,就可以触发连锁反应,使得该结点及它直接或间接指向的点均获得标记,问至少需要操作多少个结点使得所有结点获得标记

【题解】

缩点+DFS

首先能想到入度为0的点一定需要操作,但是操作完所有入度为0的点不一定使所有结点获得标记,比如存在环的情况,因此,我们需要先缩点,缩点使用Tarjan算法,详见代码,缩点之后直接统计入度为0的点有多少个即可。

代码采用链式向前星的存储结构

【代码】

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<stack>
#define P 20000
#define E 200000
using namespace std;
int i,j,k,n,T,ans,K,m,x,y,indexs,nn,mm;
int ru[P],head[P],head2[P],dfn[P],low[P],instack[P],belong[P];
bool b[E];
stack <int> tar;
 
struct node
{
	int from;
	int to;
	int next;
}map[E],map2[E];

void addedge(int num,int x,int y)
{
	map[num].from=x;
	map[num].to=y;
	map[num].next=head[x];
	head[x]=num;
}

void addedge2(int num,int x,int y)
{
	//printf("NewEdge %d %d\n",x,y); 
	
	ru[y]++;
	map2[num].from=x;
	map2[num].to=y;
	map2[num].next=head2[x];
	head2[x]=num;
}


void dfs(int p)
{
	for (int i=head2[p];i!=-1;i=map2[i].next)
	{
		if (!b[map2[i].to])
		{
			b[map2[i].to]=true;
			dfs(map2[i].to);
		}
	}
}


void tarjan(int k)
{
    int p;
    tar.push(k);
    instack[k]=1;
    dfn[k]=low[k]=++indexs;
    for(int j=head[k];j!=-1;j=map[j].next)
    {
        p=map[j].to;
        if (instack[p]) 
		{
			low[k]=min(low[k],dfn[p]);
		}
        else 
		if(dfn[p]==-1)
        {
            tarjan(p);
            low[k]=min(low[k],low[p]);
        }
    }
    if(low[k]==dfn[k])
    {
        nn++;
        do
        {
            j=tar.top();
            tar.pop();
            instack[j]=0;
            belong[j]=nn;
        }while(j!=k);
    }
}

void build_new_map()
{
    for(int i=1;i<=m;i++)
    {
        if(belong[map[i].from]==belong[map[i].to]) 
			continue;
        addedge2(++mm,belong[map[i].from],belong[map[i].to]);
    }
}
void build_map()
{
	scanf("%d%d",&n,&m);
	for (i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		addedge(i,x,y);
	}

	memset(dfn,-1,sizeof(dfn));
	memset(low,-1,sizeof(low));
	memset(instack,0,sizeof(instack));
	indexs=0;nn=0;
	
	for (i=1;i<=n;i++) belong[i]=i;
	
	for (i=1;i<=n;i++)
	{
		if (dfn[i]==-1)
			tarjan(i);
	}
	
	build_new_map();
}


int main()
{
	scanf("%d",&T);
	while (++K<=T)
	{
		memset(map,-1,sizeof(map));
		memset(head,-1,sizeof(head));
		memset(map2,-1,sizeof(map2));
		memset(head2,-1,sizeof(head2));
		memset(b,0,sizeof(b));
		memset(ru,0,sizeof(ru));
		ans=0;mm=0;nn=0;
		
		build_map();
		
		for (i=1;i<=nn;i++)
		{
			if (!ru[i])
			{
				ans++;
				b[i]=true;
				dfs(i);
			}
		}
		
		for (i=1;i<=nn;i++)
		{
			if (!b[i])
			{
				ans++;
			 	b[i]=true;
				dfs(i);
			}
		}
		printf("Case %d: %d\n",K,ans);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值