• poj 1158


    最短路的应用,只不过路径的权值从单一的长度变成了各种耗费时间的和

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    using namespace std;
    const int maxn=300+10;
    const int maxm=(50000+10)*2;
    const int inf=200000000;
    int head[maxn],dis[maxn],vis[maxn],pre[maxn],re[maxn],ans[maxn];
    int e[maxm],nextv[maxm],cost[maxm],loc[maxm];
    int s,t,n,m;
    struct node
    {
    	char c;
    	int	r,tb,tp;	
    };
    struct color
    {
    	char c;
    	int r;
    };
    node light[maxn];
    int min(int a,int b) { return a<b?a:b; }
    color getCol(int y, int time)
     {
         color tem;
    	 int did=light[y].r-time;
         if(did>0)
         {
             tem.c=light[y].c;
             tem.r=did;
         }
    	 else 
    	 {
    		 did=-did;
    		 did=did%(light[y].tb+light[y].tp);
    		 if(light[y].c=='B')
    		 {
    			 if(did<light[y].tp)	
    			 {
    				 tem.c='P';
    				 tem.r=light[y].tp-did;
    			 }
    			 else
    			 {
    				 tem.c='B';
    				 tem.r=light[y].tb-(did-light[y].tp);
    			 }
    		 }
    		 else 
    		 {
    			 if(did<light[y].tb)
    			 {
    				 tem.c='B';
    				 tem.r=light[y].tb-did;		
    			 }
    			 else 
    			 {
    				 tem.c='P';
    				 tem.r=light[y].tp-(did-light[y].tb);
    			 }
    		 }
    	 }
    	 return tem;
     }
    int getT(int from,int to,int time,int flag)
    {
    	if(flag>2) return -1;
    	color c1=getCol(from,time),c2=getCol(to,time);
    	if(c1.c==c2.c) return time;
    	else if(c1.r==c2.r)  return getT(from,to,time+c1.r,flag+1);
    	else return time+min(c1.r,c2.r);
    }
    void dijkstra()
    {
    	int i,j;
    	for(i=1;i<=n;i++)
    	{
    		dis[i]=inf; 
    		vis[i]=0;
    	}
    	dis[s]=0;
    	for(i=1;i<=n;i++)
    	{
    		int midv=inf,x=-1;
    		for(j=1;j<=n;j++)
    		{
    			if(!vis[j]&&dis[j]<midv) midv=dis[x=j];
    		}
    		if(x==-1||x==t) return;
    		vis[x]=1;
    		for(j=head[x];j!=-1;j=nextv[j])
    		{
    			int y=loc[j];
    			if(!vis[y])
    			{
    				int tem=getT(x,y,dis[x],0);
    				if(tem==-1) continue;
    				else 
    				{
    					tem+=cost[j];
    					if(tem<dis[y])
    					{
    						dis[y]=tem;
    						pre[y]=x;
    					}
    				}
    			}
    		}
    	}
    }
    void print(int tem)
    {
    	int i=tem;
    	int tot=0;
    	while(i!=s)
    	{
    		ans[tot++]=i;
    		i=pre[i];
    	}
    	printf("%d ",s);
    	if(tot>=1) for(i=tot-1;i>=0;i--) printf("%d ",ans[i]);
    
    }
    int main()
    {
    	while(~scanf("%d%d",&s,&t))
    	{
    		scanf("%d%d",&n,&m);
    		getchar();
    		int i;
    		char tc;
    		for(i=1;i<=n;i++) 
    		{
    			scanf("%c%d%d%d",&light[i].c,&light[i].r,&light[i].tb,&light[i].tp);
    			getchar();
    		}
    		memset(head,-1,sizeof(head));
    		int u,v,ti;
    		int tot=0;
    		for(i=1;i<=m;i++) 
    		{
    			scanf("%d%d%d",&u,&v,&ti);
    			loc[tot]=v;
    			nextv[tot]=head[u];
    			head[u]=tot;
    			cost[tot]=ti;
    			tot++;
    			loc[tot]=u;
    			nextv[tot]=head[v];
    			head[v]=tot;
    			cost[tot]=ti;
    			tot++;
    		}
    		dijkstra();
    		if(dis[t]==inf) printf("0\n");
    		else
    		{
    			printf("%d\n",dis[t]);
    		//	print(pre[t]);
    			//printf("%d\n",t);
    		}
    	}
    	return 0;
    }


  • 相关阅读:
    逆序对
    归并排序
    快速排序
    利用WPF InkCanvas水墨控件圈选移动笔画
    Vue使用websocket进行心跳连接
    socket + vue + canvas实践,你画我猜(一)
    Vue+WebSocket+ES6+Canvas 制作【你画我猜】小游戏
    HTML5 canvas实现画板功能
    Canvas手工作图并实时同步复现(利用websocket)
    什么是SoC?
  • 原文地址:https://www.cnblogs.com/lj030/p/3002222.html
Copyright © 2020-2023  润新知