zoukankan      html  css  js  c++  java
  • Remmarguts' Date(A* 短路)

    Aimeeeeeeeeeeeeeeeeeeee

    人是会变的
    我从没想过有一天我会不想放假

    一个小小的A*,求出来每一个点到终点的距离作为估价函数

    (显然这是最乐观的情况)

    然后就是一个搜索了

    搜索的key就是估价+走过的距离

    并且显然如果一个点已经被取出了k次,那么这个点就是不会对第k条路起作用了

    那么就扔掉

    Aimee Aimee Aimee

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue> 
    using namespace std;
    int n,m;
    int head[1005][2];
    struct b{
    	int to;
    	int ne;
    	int v;
    } e[200001][2];
    int Aimee[1005];
    int x,y,z;
    struct nod{
    	int po;
    	int dis;
    	int di;
    	friend bool operator < ( nod x, nod y) {
    		return x.dis>y.dis;
    	} 
    };
    int s,t,k; 
    int dis[1005];
    int vis[1005];
    priority_queue <nod> q;
    nod tem,temm;
    int p[2];
    void add(int f,int to,int v,int fl){
    	p[fl]++;
    	e[p[fl]][fl].ne=head[f][fl];
    	e[p[fl]][fl].to=to;
    	e[p[fl]][fl].v=v;
    	head[f][fl]=p[fl];
    	return ;
    }
    void dij(int now){
    		memset(dis,0x3f,sizeof(dis));
    		dis[t]=0;
    		temm.dis=0;
    		temm.po=t;
    		temm.di=0;
    		q.push((temm));
    		while(!q.empty()){
    			tem=q.top();
    			q.pop();
    			if(vis[tem.po]){
    				continue; 
    			}
    			vis[tem.po]++;
    			int u=tem.po;
    			for(int i=head[u][now];i;i=e[i][now].ne){
    				int v=e[i][now].to;
    				if(dis[v]>dis[u]+e[i][now].v){
    					dis[v]=dis[u]+e[i][now].v;
    					temm.dis=dis[v];
    					temm.po=v;
    					temm.di=0;
    					q.push(temm );
    				}
    			}					
    		}
    }
    void Aimeeeeeeeeee(int now){
    	memset(vis,0,sizeof(vis));
    	while(!q.empty()){
    		q.pop();
    	}
    		temm.dis=dis[s];
    		temm.po=s;
    		temm.di=0;
    		q.push(temm);
    		while(!q.empty()){
    			tem=q.top();
    			q.pop();
    		vis[tem.po]++;
    			int u=tem.po;
    			if(vis[tem.po]==k&&tem.po==t){
    				cout<<tem.di<<endl;
    				exit(0); 
    				return ;
    			}
    			if(vis[u]>k)
    				continue; 
    			for(int i=head[u][now];i;i=e[i][now].ne){
    				int v=e[i][now].to;
    					if(vis[v]>=k)
    					continue; 
    				temm.dis=tem.di+e[i][now].v+dis[v];
    				temm.po=v;
    				temm.di=tem.di+e[i][now].v;
    				q.push(temm);
    			}					
    		}
    }
    signed main(){
    	scanf("%ld%ld",&n,&m);
    	for(int i=1;i<=m;++i){
    		scanf("%ld%ld%ld",&x,&y,&z);
    		add(x,y,z,1);
    		add(y,x,z,0);
    	}
    	scanf("%ld%ld%ld",&s,&t,&k); 
    	dij(0);
    	if(s==t)
    	k++;
    	Aimeeeeeeeeee(1); 
    	cout<<-1<<endl;
    	return 0;
    }
    
    
    
  • 相关阅读:
    jq动画效果
    each循环和节点操作
    jquery的基础语法
    JS作用域
    DOM事件
    js语法一
    socketserver模块与mysql语句(一)
    亲测idea编辑器控制台中文乱码成功的解决方法
    PHP Fatal error: Call to undefined function json_decode()
    PHP <? 标签问题导致不能正确运行代码
  • 原文地址:https://www.cnblogs.com/For-Miku/p/14045333.html
Copyright © 2011-2022 走看看