ZOJ 3223 Journey to the Center of the Earth DP+dijstra 二维最短路

做法:一开始就想到dijstra,可惜了...DP了解不深

#include<cstdio>
#include<cstring>
#include<queue>
#include<utility>
#include<vector>
#define eps 1e18
#define LL long long
/********
dij,其实就是一种DP思想,每一个状态(出来初始点)都会存在一个前状态,
DP需要让这些前状态都是最优的,所以dij每次要从里原点”最短“的边开始,这里的
最短,可能是长度、时间、等等。当然这里的变成了二维的条件,所以值得思考的是
什么是“最短”,嗯,用最少的小路是第一,但是,长度也必须要小。
*********/
using namespace std;
const int LMT=102;
int next[LMT],vis[LMT][5003],all,n,cs;
LL dis[LMT][5003],T;
struct path
{
    int dis,time;
    LL len;
};
struct cmp
{
    bool operator()(path a,path b)
    {
        if(a.time!=b.time)return a.time>b.time;
        return a.len>b.len;
    }
};
struct line
{
	int u,v,len,tag,next;
}e[LMT*LMT<<1];
void init(void)
{
	memset(next,-1,sizeof(next));
	all=0;
}
void insert(int u,int v,int len,int tag)
{
	e[all].u=u;
	e[all].v=v;
	e[all].tag=tag;
	e[all].len=len;
	e[all].next=next[u];
	next[u]=all++;
}
int dij(int s,int t)
{
	int u,i,j,ti;
    path elem,tem;
   priority_queue<path,vector<path>,cmp>q;
    for( i=0;i<LMT;i++)
		 for(j=0;j<5003;j++)dis[i][j]=eps;
    memset(vis,0,sizeof(vis));
    dis[s][0]=0;
    elem.dis=s;
    elem.time=0;
    elem.len=0;
    q.push(elem);
    while(!q.empty())
    {
        elem=q.top();
        q.pop();
		u=elem.dis;
        if(elem.len>T)continue;
		if(u==t)return elem.time;
		ti=elem.time;
        if(vis[u][ti])continue;
        vis[u][ti]=1;
        for(int x=next[u];x!=-1;x=e[x].next)
        if(dis[e[x].v][e[x].tag+ti]>dis[u][ti]+e[x].len)
        {
			dis[e[x].v][e[x].tag+ti]=dis[u][ti]+e[x].len;
			tem.dis=e[x].v;tem.time=e[x].tag+ti;
			tem.len=dis[u][ti]+e[x].len;
			q.push(tem);
        }
    }
    return -1;
}
int main(void)
{
	int m,u,v,len,s,t,i,ans;
	while(~scanf("%d%d",&n,&m))
	{
		init();
		while(m--)
		{
			scanf("%d%d%d",&u,&v,&len);
			insert(u,v,len,0);
			insert(v,u,len,0);
		}
		scanf("%d",&cs);
		for(i=0;i<cs;i++)
		{
			scanf("%d%d%d",&u,&v,&len);
			insert(u,v,len,1);
			insert(v,u,len,1);
		}
		scanf("%d%d%I64d",&s,&t,&T);
		ans=dij(s,t);
		if(ans==-1)printf("Impossible\n");
		else printf("%d\n",ans);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值