zoukankan      html  css  js  c++  java
  • Spfa+DP【p2149】[SDOI2009]Elaxia的路线

    Description

    最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。

    Elaxia和w**每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。

    现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。

    Input

    第一行:两个整数N和M(含义如题目描述)。

    第二行:四个整数x1、y1、x2、y2(1 ≤ x1 ≤ N,1 ≤ y1 ≤ N,1 ≤ x2 ≤ N,1 ≤ y2 ≤ N),分别表示Elaxia的宿舍和实验室及w**的宿舍和实验室的标号(两对点分别 x1,y1和x2,y2)。

    接下来M行:每行三个整数,u、v、l(1 ≤ u ≤ N,1 ≤ v ≤ N,1 ≤ l ≤ 10000),表 u和v之间有一条路,经过这条路所需要的时间为l。

    Output

    一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)

    一句话题意,求两对点间最短路的最长公共路径.

    首先需要明确的是,我们需要跑最短路.

    先跑出第一组点对之间的最短路,标记最短路上的边,然后再跑第二组点对的最短路,最后需要再小小的记录一下答案即可.

    注意(to[u])代表到达(u)这个节点的最长公共路径.

    每次取(max)即可,应该不是很难理解,就不过多解释了.

    代码

    #include<cstdio>
    #include<cctype>
    #include<cstring>
    #include<queue>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #define int long long
    #define clear(a,b) memset(a,b,sizeof a)
    #define N 2005
    #define R register
    using namespace std;
    inline void in(int &x)
    {
    	int f=1;x=0;char s=getchar();
    	while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
    	while(isdigit(s)){x=x*10+s-'0';s=getchar();}
    	x*=f;
    }
    int n,m,a,b,c,d,dis[N],head[N],tot=-1;
    struct cod{int u,v,w,flg;}edge[N*N];
    bool vis[N];
    inline void add(int x,int y,int z)
    {
    	edge[++tot].u=head[x];
    	edge[tot].v=y;
    	edge[tot].w=z;
    	head[x]=tot;
    }
    inline void spfa(int s)
    {
    	clear(dis,0x7f);clear(vis,0);
    	dis[s]=0;vis[s]=true;
    	queue<int>q;q.push(s);
    	while(!q.empty())
    	{
    		int u=q.front();q.pop();vis[u]=false;
    		for(R int i=head[u];i!=-1;i=edge[i].u)
    		{
    			if(dis[edge[i].v]>dis[u]+edge[i].w)
    			{
    				dis[edge[i].v]=dis[u]+edge[i].w;
    				if(!vis[edge[i].v])
    				{
    					vis[edge[i].v]=true;
    					q.push(edge[i].v);
    				}
    			}
    		}
    	}
    }
    inline void calc()
    {
    	clear(vis,0);
    	queue<int>q;q.push(b);vis[b]=true;
    	while(!q.empty())
    	{
    		int u=q.front();q.pop();
    		for(R int i=head[u];i!=-1;i=edge[i].u)
    		{
    			if(dis[edge[i].v]+edge[i].w==dis[u])
    			{
    				edge[i].flg=edge[i^1].flg=1;
    				if(!vis[edge[i].v])
    				{
    					vis[edge[i].v]=true;
    					q.push(edge[i].v);
    				}
    			}
    		}
    		
    	}
    }
    bool inq[N];
    int to[N];
    inline int ans()
    {
    	R int ans=0;clear(vis,0);
    	queue<int>q;q.push(d);vis[d]=inq[d]=true;
    	while(!q.empty())
    	{
    		int u=q.front();q.pop();inq[u]=false;
    		for(R int i=head[u];i!=-1;i=edge[i].u)
    		{
    			if(dis[edge[i].v]+edge[i].w==dis[u])
    			{
    				if(edge[i].flg and to[edge[i].v]<to[u]+edge[i].w)
    				{
    					to[edge[i].v]=to[u]+edge[i].w;
    					ans=max(ans,to[edge[i].v]);
    					if(!inq[edge[i].v])
    					{
    						inq[edge[i].v]=true;
    						q.push(edge[i].v);
    					}
    				}
    				if(!vis[edge[i].v])
    				{
    					vis[edge[i].v]=inq[edge[i].v]=true;
    					q.push(edge[i].v);
    				}
    			}
    		}
    	}
    	return ans;
    }
    signed main()
    {
    	in(n),in(m);clear(head,-1);
    	in(a),in(b),in(c),in(d);
    	for(R int i=1,x,y,z;i<=m;i++)
    	{
    		in(x),in(y),in(z);
    		add(x,y,z);add(y,x,z);
    	}
    	spfa(a);;calc();spfa(c);
    	printf("%lld
    ",ans());
    }
    
  • 相关阅读:
    Django测试开发-20-settings.py中templates配置,使得APP下的模板以及根目录下的模板均可生效
    Django测试开发-19-auth模块之session,cookie
    Django测试开发-19-引入xadmin
    Django测试开发-17-报错:No module named 'django.contrib.staticfiles.templatetags'
    Django测试开发-16-ImportError: cannot import name 'six' from 'django.utils'
    Django测试开发-15-django.utils.encoding未发现 python_2_unicode_compatible包
    Django测试开发-14-数据库表设计:多对多,一对一,一对多
    Django测试开发-13-优化表单提交(GET、POST、登录、注册)
    Django测试开发-12-优化admin (2020-03-13 18:57)
    Django测试开发-11-返回json数据
  • 原文地址:https://www.cnblogs.com/-guz/p/9822639.html
Copyright © 2011-2022 走看看