zoukankan      html  css  js  c++  java
  • zoj1232Adventure of Super Mario

    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<stdio.h>
    #include<cstring>
    using namespace std;
    /*题意:马里奥要从A+B出的城堡走到1处的村庄,途中他可以使用boot,从任意i处到达j处,但是i与j的
    距离不能超过L,且使用boot的次数不能多于K次,而且在使用时 遇到城堡就要停下来,而且只能在村庄
    或城堡开始或停止使用boot,求从A+B到1所用的最短时间
    */
    int A,B,M,L,K,ANS;
    const int INF=100000000;
    int zero[105][105],d[105][105],g[101][101], inq[101][11];
    //inq[i][k]表示从A+B走到i处且用boot k次所用的最短时间,zero[i][j]表示i,j之间是否有0路
    
    struct node
    {
    	int v,num,time;//v目前所在点,num所用boot次数,time所耗时间
    	node(int _v,int _num,int _time):v(_v),num(_num),time(_time){};
    	friend bool operator <(const node &a,const node &b)
    	{
    		if(a.num!=b.num)return a.num>b.num;
    		return a.time>b.time;
    	}
    };
    void add_zero()
    {
    	//用floyd算出各点的最短距离,以判断可否加0路
    	for(int k=1;k<=A;k++)//城堡不能成为中转站,因为boot失效
    		for(int i=1;i<=A+B;i++)
    			for(int j=1;j<=A+B;j++)
    			{
                    if(d[i][j]>d[i][k]+d[k][j])
    					d[i][j]=d[i][k]+d[k][j];
    			}
    		
    	for(int i=1;i<=A+B;i++)
    		for(int j=1;j<=A+B;j++)
    			if(d[i][j]<=L){zero[i][j]=1;zero[j][i]=1;}//可以用boot	
    }
    void Dij()
    {
    	priority_queue <node> pq;
    	pq.push(node(A+B,0,0));
    	
    	for(int i=1;i<=A+B;i++)
    		for(int j=0;j<=K;j++)
    			inq[i][j]=INF;
    	int done[101][11];//done[i][k]表示用k次boot到i处已经算过(已是最优)
    	memset(done,0,sizeof(done));
    	
    	while(!pq.empty())
    	{
    		node t=pq.top();
    		pq.pop();
    		done[t.v][t.num]=1;
    		if(t.num>K)continue;
    		if(t.num<=K&&t.v==1&&t.time<ANS){ANS=t.time;continue;}
    		if(t.num<=K&&t.v==1&&t.time>=ANS)continue;
    		if(t.num<=K&&t.v!=1&&t.time>=ANS)continue;
    		for(int i=A+B;i>=1;i--)
    		{
    			if((g[t.v][i]!=INF||zero[t.v][i]))//如果有路可以走
    			{
    				if(!done[i][t.num]&&g[t.v][i]!=INF&&t.time+g[t.v][i]<inq[i][t.num])
    				{
    					inq[i][t.num]=t.time+g[t.v][i];
    					pq.push(node(i,t.num,t.time+g[t.v][i]));
    				}
    				if(!done[i][t.num+1]&&zero[t.v][i]&&t.time<inq[i][t.num+1])
    				{
    					inq[i][t.num+1]=t.time;pq.push(node(i,t.num+1,t.time));
    				}
    
    			}
    		}
    	}
    }
    void set()//各种初始化
    {
    	for(int i=1;i<=A+B;i++)
    		for(int j=1;j<=A+B;j++)
    		{d[i][j]=INF;g[i][j]=INF;}
        memset(zero,0,sizeof(zero));
        for(int i=1;i<=A+B;i++)
    	   for(int j=0;j<=K;j++)
    			inq[i][j]=INF;
    	ANS=INF;
    }
    int main()
    {
    	int cas,a,b,c;
    	cin>>cas;
    	while(cas--)
    	{
    	   scanf("%d%d%d%d%d",&A,&B,&M,&L,&K);
    	   set();
    	   for(int i=0;i<M;i++)
    	   {
               scanf("%d%d%d",&a,&b,&c);
    		   g[a][b]=c,g[b][a]=c;
    		   d[a][b]=c;d[b][a]=c;
    	   }
    	   add_zero();
           Dij();
    	   printf("%d\n",ANS);
    	}
    
    }
    
  • 相关阅读:
    【原】git常见用法
    【转】EDID的简介和解析
    rsa公钥和私钥的生成
    往redis中存储数据是利用pipeline方法
    对于接口文档个的说明内容包括哪些
    blueprint的使用
    flask中如何生成迁移文件
    flask中自定义过滤器
    jsonify
    flask自定义处理错误方法
  • 原文地址:https://www.cnblogs.com/sook/p/2024632.html
Copyright © 2011-2022 走看看