首页 > 其他分享 >nyoj 247

nyoj 247

时间:2023-05-29 22:33:03浏览次数:31  
标签:min int max s1 nyoj 247 edge s2


题意:从1-n的一条路径中,找出两点,使得两点权值之差最大。n个点不一定要都经过。


解题思路:这道题实际可以转化为找出可达的两点a,b,使得a和b两点的权值之差最大。。。这道题确实很难想到是转化为最短路的模型,我开始还是按照论坛里面说的,先求强连通分量、缩点,最后再搜索,结果挂了。。

假设最后的结果是a-b,那么我们肯定要保证a>b,否则根据题意就无意义。并且我们还应该要有b->a,即可以从b走到a,那么就定义两个数组d_min[i],和d_max[i],分别表示从1->i经过点的最小值和从i->n经过点的最大值,最后只需找到最大的d_max[i] - d_min[i]即可。为了方便求d_max[i],我们应该要从n出发寻找,所以应该要建立反向边。

注意:这里是能够保证我们之前讲的两条性质,注意到d_min和d_max表示的意义,是1->i和i->n所经过的点的最小和最大值,如果a在b的前面,那么肯定d_max和d_min不会同时包含a和b的(画图即可明白),如果a<b,毫无疑问肯定算出的不会是最优值。

这里算d_min和d_max可以用spfa算法,确实spfa算法在最短路里面的应用非常广。总之这样运用spfa还是第一次见。。。



#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

const int maxn = 100005;
struct Edge
{
	int k,next;
}edge[maxn<<2];
int n,m,cnt,d_max[maxn],d_min[maxn];
int head1[maxn],head2[maxn];
bool s1[maxn],s2[maxn];

void addedge(int u,int v)
{
	edge[cnt].k = v;
	edge[cnt].next = head1[u];
	head1[u] = cnt++;

	edge[cnt].k = u;
	edge[cnt].next = head2[v];
	head2[v] = cnt++;
}

void spfa()
{
	queue<int> q;
	memset(s1,false,sizeof(s1));
	memset(s2,false,sizeof(s2));
	q.push(1);
	s1[1] = true;
	while(!q.empty())
	{
		int t = q.front();
		q.pop();
		for(int i = head1[t]; i != -1; i = edge[i].next)
		{
			int k = edge[i].k;
			d_min[k] = min(d_min[t],d_min[k]);
			if(s1[k] == false)
			{
				s1[k] = true;
				q.push(k);
			}
		}
	}
	q.push(n);
	s2[n] = true;
	while(!q.empty())
	{
		int t = q.front();
		q.pop();
		for(int i = head2[t]; i != -1; i = edge[i].next)
		{
			int k = edge[i].k;
			d_max[k] = max(d_max[t],d_max[k]);
			if(s2[k] == false)
			{
				s2[k] = true;
				q.push(k);
			}
		}
	}
	int ans = 0;
	for(int i = 1; i <= n; i++)
		if(s1[i] && s2[i])
		{
			ans = max(ans,d_max[i] - d_min[i]);
		}
	printf("%d\n",ans);
}

int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		memset(head1,-1,sizeof(head1));
		memset(head2,-1,sizeof(head2));
		cnt = 0;
		for(int i = 1; i <= n; i++)
		{
			scanf("%d",&d_max[i]);
			d_min[i] = d_max[i];
		}
		for(int i = 1; i <= m; i++)
		{
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			addedge(x,y);
			if(z == 2)
				addedge(y,x);
		}
		spfa();
	}
	return 0;
}





标签:min,int,max,s1,nyoj,247,edge,s2
From: https://blog.51cto.com/u_16143128/6374338

相关文章

  • nyoj 237
    游戏高手的烦恼1000 ms | 内存限制:655355有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人。他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有......
  • nyoj 304(区间dp)
    解题思路:这道题很明显是用区间dp,可是与以往的区间dp不同,因为对于区间[i,j],机器人所处的位置要么在i,要么在j(因为机器人要移动到某一点才能关闭灯泡,所以对于某一段区间来说,机器人最后肯定在两个端点上,否则将不能成立),那么既然要表示在左端点还是右端点,所以我们再开三维数组dp[i][j][0]......
  • nyoj 307(最短路变形)
    解题思路:这道题和上一道题一样,也是最短路的变形,我之前的想法是二分答案,然后再dp去判断是否可以满足要求,但发现这样子的话会存在问题:因为一条路可能走多次,就无法保证其后效性。看了别人的思路:先以每个有宝藏的地方为起点,找到其到1号节点所符合题意的最大边max,表示最多可以从该节点运......
  • Chemistry Experiment Codeforces Round 247 (Div. 2) 线段树动态开点,二分
    第一次写的时候还不会线段树的动态开点,写了一个是线段树但是是\(O(N^2)\)的写法,现在用动态开点武装了自己,会了正解\(O(qlogn^2)\)。首先建立一个权值线段树,但这里的权值很大,通过动态开点去建树来节省空间,对于两种操作:操作1,常见的动态开点的单点修改操作2,二分答案,然后在线段树......
  • 第六届河南省赛 zzulioj 1484: 探 寻 宝 藏 (二维双线DP)nyoj 712
    1484:探寻宝藏TimeLimit: 1Sec  MemoryLimit: 128MBSubmit: 76  Solved: 37SubmitStatusWebBoardDescription传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物。某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷......
  • nyoj 坦克大战 284 (bfs) 模板
    坦克大战1000ms |          内存限制:655353Manyofushadplayedthegame"Battlecity"inourchildhood,andsomepeople(likeme)evenoftenplayitoncomputernow.Whatwearediscussingisasimpleeditionofthisgame.Givena......
  • HDU 2473 Junk-Mail Filter(并查集的删除操作)
    题目地址:HDU2473这题以前碰到过,没做出来。。现在又做了做,还是没做出来。。、、这题涉及到并查集的删除操作。想到了设一个虚节点,但是我把虚节点设为了要删除的点的父节点,一直是栈溢出,目测是无限递归了。看了看别人的做法,原来只要建一个映射就可以了,虚节点是作为的新的映射,每......
  • Calling Circles UVA - 247
    如果两个人相互打电话(直接或间接),则说他们在同一个电话圈里。例如,a打给b,b打给c,c打给d,d打给a,则这4个人在同一个圈里;如果e打给f但f不打给e,则不能推出e和f在同一个电话圈里。输入n(n≤25)个人的m次电话,找出所有电话圈。人名只包含字母,不超过25个字符,且不重复 对于一个有向图,Flo......
  • abc247_f Cards 题解
    Cards题意有\(N\)张卡片,每张卡片上都写有两个数字,第\(i\)张卡片上的数字分别为\(P_i,Q_i\)。同时,\(P=(P_1,P_2,\dots,P_N)\)和\(Q=(Q_1,Q_2,\dots,Q_N)\)都是\((1,2,\dots,N)\)的全排列。我们需要在\(N\)张卡片中选出一些卡片,并且\(1,2,\dots,N......
  • UVa 443 / POJ 2247 Humble Numbers (4因子-丑数&STL灵活运用)
    443-HumbleNumbersTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=384http://poj.org/problem?id=2247Anumberwhoseonlyprimefactorsare2,3,5or7isc......