【强连通缩点+最长路】抢掠计划

原创 2012年03月29日 09:01:23

抢掠计划
Siruseri城中的道路都是单向的。不同的道路由路口连接。按照法律的规定,
在每个路口都设立了一个 Siruseri 银行的 ATM 取款机。令人奇怪的是,Siruseri
的酒吧也都设在路口,虽然并不是每个路口都设有酒吧。
Banditji 计划实施 Siruseri有史以来最惊天动地的 ATM 抢劫。他将从市中心
出发,沿着单向道路行驶,抢劫所有他途径的ATM 机,最终他将在一个酒吧庆
祝他的胜利。
使用高超的黑客技术,他获知了每个ATM 机中可以掠取的现金数额。他希
望你帮助他计算从市中心出发最后到达某个酒吧时最多能抢劫的现金总数。他可
以经过同一路口或道路任意多次。但只要他抢劫过某个 ATM 机后,该 ATM 机
里面就不会再有钱了。
例如,假设该城中有6个路口,道路的连接情况如下图所示: 


 
市中心在路口 1,由一个入口符号→来标识,那些有酒吧的路口用双圈来表
示。每个ATM机中可取的钱数标在了路口的上方。在这个例子中,Banditji 能抢
劫的现金总数为47,实施的抢劫路线是:1-2-4-1-2-3-5。
输入格式
第一行包含两个整数 N、M。N 表示路口的个数,M表示道路条数。接下来
M行,每行两个整数,这两个整数都在 1到 N 之间,第i+1 行的两个整数表示第
i 条道路的起点和终点的路口编号。接下来 N 行,每行一个整数,按顺序表示每
个路口处的ATM机中的钱数。接下来一行包含两个整数 S、P,S表示市中心的
编号,也就是出发的路口。P表示酒吧数目。接下来的一行中有 P个整数,表示
P个有酒吧的路口的编号。
输出格式
输出一个整数,表示 Banditji 从市中心开始到某个酒吧结束所能抢劫的最多
的现金总数。

数据范围
50%的输入保证 N,  M<=3000。所有的输入保证 N,  M<=500000。每个 ATM
机中可取的钱数为一个非负整数且不超过 4000。输入数据保证你可以从市中心
沿着Siruseri的单向的道路到达其中的至少一个酒吧。
输入样例
6 7
1 2
2 3
3 5
2 4
4 1
2 6
6 5
10
12
8
16
1
5
1 4
4 3 5 6
输出样例
47


和上一道题如出一辙,此题是一个简化版本,不用再赘述。

只是因为ans = MAX(ans,dist[Belong[bar[i]]]+size[Belong[S]]);  

打成了ans = MAX(ans,dist[bar[i]]+size[Belong[S]]);    而悲剧地爆零了


#pragma comment(linker, "/STACK:1024000000,1024000000") 
#include <cstdio>
#include <map>

const long maxn = 500010;
const long MOD = 500010;
typedef long long ll;
long n;long m;
long S;long P;
long money[maxn];
long bar[maxn];
long DFN[maxn];
long LOW[maxn];
bool InStack[maxn];
long Stack[maxn];
long top  = 0;
long TIME = 0;
long Bcnt = 0;
long Belong[maxn];
long size[maxn];
long que[MOD];
bool vis[maxn];
long dist[maxn];
std::map<ll,bool> connected;
#define POS(a,b) (((ll)a-1)*(ll)m+(ll)b-1ll)
#define MIN(a,b) (a<b?a:b)
#define MAX(a,b) (a>b?a:b)

struct node
{
	long index;
	node* next;	
};
node* head[maxn];
node* head2[maxn];

void insert(long a,long b)
{
	node* tmp = new node;
	tmp->index = b;
	tmp->next = head[a];
	head[a] = tmp;
}

void init()
{
	scanf("%ld%ld",&n,&m);
	for (long i=1;i<m+1;i++)
	{
		long a;long b;
		scanf("%ld%ld",&a,&b);
		insert(a,b);
	}
	for (long i=1;i<n+1;i++)
	{
		scanf("%ld",money+i);
	}
	scanf("%ld%ld",&S,&P);
	for (long i=1;i<P+1;i++)
	{
		scanf("%ld",bar+i);
	}
}

void tarjan(long u)
{
	DFN[u] = LOW[u] = ++TIME;
	InStack[u] = true;
	Stack[++top] = u;
	for (node* next=head[u];next;next=next->next)
	{
		long v = next->index;
		if (!DFN[v])
		{
			tarjan(v);
			LOW[u] = MIN(LOW[u],LOW[v]);
		}
		else if(InStack[v])
		{
			LOW[u] = MIN(LOW[u],DFN[v]);
		}
	}
	if (DFN[u] == LOW[u])
	{
		++Bcnt;
		long v;
		do
		{
			v = Stack[top--];
			InStack[v]= false;
			Belong[v] = Bcnt;
			size[Bcnt]+=money[v]; 
		}while(v != u);
	}
}

void SPFA()
{
	long l = 0;
	long r = 0;
	que[++r] = Belong[S];
	while (l != r)
	{
		l = (l+1) % MOD;
		long u = que[l];
		vis[u] = false;
		for (node* vv=head2[u];vv;vv=vv->next)
		{
			long v = vv->index;
			if (dist[v]<dist[u]+size[v])
			{
				dist[v]=dist[u]+size[v];
				if (!vis[v])
				{
					vis[v] = true;
					r = (r+1) % MOD;
					que[r] = v;
				}
			}
		}
	}	
}

void insert2(long a,long b)
{
	node* tmp = new node;
	tmp->index = b;
	tmp->next = head2[a];
	head2[a] = tmp;
}

void rebuild()
{
	for (long u=1;u<n+1;u++)
	{
		for (node* vv=head[u];vv;vv=vv->next)
		{
			long v = vv->index;
			long B1 = Belong[u];
			long B2 = Belong[v];
			if (B1 != B2 && !connected[POS(B1,B2)])
			{
				connected[POS(B1,B2)] = true;
				insert2(B1,B2);
			}
		}
	}
}

int main()
{
	freopen("atm.in","r",stdin);
	freopen("atm.out","w",stdout); 
	init();
	for (long i=1;i<n+1;i++)
		if (!DFN[i]) tarjan(i);
	rebuild();
	SPFA();
	long ans = 0;
	for (long i=1;i<P+1;i++)
	{
		ans = MAX(ans,dist[Belong[bar[i]]]+size[Belong[S]]);	
	}
	printf("%ld",ans);
	return 0;
}





信号量与临界资源的使用——双向道路汽车过窄桥

临界资源或临界区是指在同一时刻只允许一个进程或线程访问,并且只有当占有该资源的进程释放了该资源后,才能被其他进程使用。因此需要设计一种机制保障进程间的通信,使得不同的进程能够知道临界资源的使用情况,当...
  • wang_dong001
  • wang_dong001
  • 2016年12月27日 11:04
  • 261

欧拉回路与欧拉道路

欧拉回路        图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。 具有欧拉回路的图称为欧拉图(简称E图)。 有向图的欧拉回路 一个有向图存在欧拉回路的前提...
  • y990041769
  • y990041769
  • 2013年07月18日 18:49
  • 5693

ArcGIS制图—道路

本文主要介绍在制图中对道路的处理技术:道路合并、道路冲突解决     对于双线道路,在小比例尺下显示“单线”、大比例尺下显示“双线”;但是在过渡比例尺的情况下会出现单、双线并存的情况。如下图所示 ...
  • SYDBC
  • SYDBC
  • 2013年12月17日 15:16
  • 3535

教你操作道路沿线标注

制作电子地图时,经常要给地图中的道路添加标注,也就是地图制图中常说的沿线标注。地图中的沿线标注要兼顾合理与美观两方面,既要花时间和心思去设计,又要充分利用制图软件的相关功能,才能使理想与现实完美结合。...
  • supermapping
  • supermapping
  • 2015年10月16日 14:22
  • 3279

不使用路由器来实现不同网段(子网)计算机之间通信的方法

文章针对有IP网络基础知识,对osi和以太网有基本了解的人群! 首先介绍一下,网关的作用,因为实现中要借助网关。     路由器是三层的设备,主要协议为IP。三层设备主要负责寻址,通过查看自已通过各...
  • bzhxuexi
  • bzhxuexi
  • 2015年04月17日 16:03
  • 4607

导航中GPS位置与地图匹配、道路匹配算法

导航中GPS位置与地图匹配、道路匹配算法 文章转自:http://blog.csdn.net/viewcode/article/details/7918721 0. 地图匹...
  • keykeywu
  • keykeywu
  • 2013年08月21日 14:47
  • 2325

道路识别demo

最近做的道路识别一开始终于弄懂了点东西,一开始在网上找到了一个简单的道路识别的opencvsharp的版本。我觉得opencvsharp真的是一个很好的东西,它封装了比opencv更多的数据结构和库,...
  • neal1991
  • neal1991
  • 2015年04月15日 09:55
  • 2934

单臂路由 不同vlan不同网段之间互通

R1、R2为交换机,R3~R5为pc,R6为路由器 R3(config)#no ip routing R3(config)#int f0/0 R3(config-if)#ip add 192.168....
  • shienquan
  • shienquan
  • 2015年03月07日 19:31
  • 1559

设置静态路由 不同网段可以互相访问

设置静态路由 不同网段可以互相访问 (2012-07-30 06:59:31) 标签: 杂谈 分类:网络技术     随着宽带接入的普及,很多家庭...
  • ppp2006
  • ppp2006
  • 2016年08月10日 10:06
  • 2417

利用到路面提取道路中心线的方法

利用到路面提取道路中心线的方法   在利用GIS制图时,需要经常跟数据打交道。很多初级的制图人员都存在一种惯性思路,以为数据精度越高,出图的效果就越好。这是错误的观点。假如现在需要制作1:1w的地图...
  • liyuanxiang1984
  • liyuanxiang1984
  • 2016年10月11日 08:23
  • 6173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【强连通缩点+最长路】抢掠计划
举报原因:
原因补充:

(最多只允许输入30个字)