• poj 2449 Remmarguts' Date K短路+A*


    题目链接:http://poj.org/problem?id=2449

    "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he told them a story. 

    "Prince Remmarguts lives in his kingdom UDF – United Delta of Freedom. One day their neighboring country sent them Princess Uyuw on a diplomatic mission." 

    "Erenow, the princess sent Remmarguts a letter, informing him that she would come to the hall and hold commercial talks with UDF if and only if the prince go and meet her via the K-th shortest path. (in fact, Uyuw does not want to come at all)" 

    Being interested in the trade development and such a lovely girl, Prince Remmarguts really became enamored. He needs you - the prime minister's help! 

    DETAILS: UDF's capital consists of N stations. The hall is numbered S, while the station numbered T denotes prince' current place. M muddy directed sideways connect some of the stations. Remmarguts' path to welcome the princess might include the same station twice or more than twice, even it is the station with number S or T. Different paths with same length will be considered disparate. 

    题意描述:王子和喜欢的女孩儿在不同的城堡里,王子为了见女孩儿,必须从自己的城堡走第K条最短的路径到达女孩儿所在的城堡里。求第K条最短路径的长度。

    算法分析:K短路的模板题,一般运用A*算法求解。

    说明:这道题的K达1000之多,应该是POJ上面这道题的数据不强吧,数据极限的时候估计A*TLE吧。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<cmath>
      6 #include<algorithm>
      7 #include<queue>
      8 #define inf 0x7fffffff
      9 using namespace std;
     10 const int maxn=1000+10;
     11 const int M = 100000+10;
     12 
     13 int n,m,from,to,K;
     14 struct Edge
     15 {
     16     int to,w;
     17     int next;
     18 }edge[M*4],edge2[M*4];
     19 int head[maxn],edgenum;
     20 int head2[maxn],edgenum2;
     21 
     22 void add(int u,int v,int w)
     23 {
     24     edge[edgenum].to=v ;edge[edgenum].w=w;
     25     edge[edgenum].next=head[u] ;head[u]=edgenum++ ;
     26 }
     27 void add2(int u,int v,int w)
     28 {
     29     edge2[edgenum2].to=v ;edge2[edgenum2].w=w;
     30     edge2[edgenum2].next=head2[u] ;head2[u]=edgenum2++ ;
     31 }
     32 
     33 int dis[maxn],vis[maxn];
     34 void spfa()
     35 {
     36     for (int i=1 ;i<=n ;i++) {dis[i]=inf ;vis[i]=0 ; }
     37     queue<int> que;
     38     que.push(to);
     39     vis[to]=1;
     40     dis[to]=0;
     41     while (!que.empty())
     42     {
     43         int u=que.front() ;que.pop() ;
     44         vis[u]=0;
     45         for (int i=head[u] ;i!=-1 ;i=edge[i].next)
     46         {
     47             int v=edge[i].to;
     48             if (dis[v]>dis[u]+edge[i].w)
     49             {
     50                 dis[v]=dis[u]+edge[i].w;
     51                 if (!vis[v])
     52                 {
     53                     vis[v]=1;
     54                     que.push(v);
     55                 }
     56             }
     57         }
     58     }
     59     return ;
     60 }
     61 
     62 struct node
     63 {
     64     int to,g,f;///评估函数: f=g+h;
     65     friend bool operator < (node a,node b)
     66     {
     67         if (a.f != b.f) return a.f > b.f;
     68         return a.g > b.g;
     69     }
     70 }cur,tail;
     71 
     72 int A_star()
     73 {
     74     if (from==to) K++;
     75     if (dis[from]==inf) return -1;
     76     priority_queue<node> Q;
     77     cur.to=from ;cur.g=0 ;cur.f=cur.g+dis[from];
     78     Q.push(cur);
     79     int cnt=0;
     80     while (!Q.empty())
     81     {
     82         cur=Q.top() ;Q.pop() ;
     83         int u=cur.to;
     84         if (u==to) cnt++;
     85         if (cnt==K) return cur.g;
     86         for (int i=head2[u] ;i!=-1 ;i=edge2[i].next)
     87         {
     88             tail.to=edge2[i].to;
     89             tail.g=cur.g+edge2[i].w;
     90             tail.f=tail.g+dis[edge2[i].to ];
     91             Q.push(tail);
     92         }
     93     }
     94     return -1;
     95 }
     96 
     97 //int flag[maxn][maxn];
     98 int main()
     99 {
    100     while (scanf("%d%d",&n,&m)!=EOF)
    101     {
    102         memset(head,-1,sizeof(head));
    103         memset(head2,-1,sizeof(head2));
    104         edgenum=0;
    105         edgenum2=0;
    106         //memset(flag,0,sizeof(flag));
    107         int a,b,c;
    108         for (int i=0 ;i<m ;i++)
    109         {
    110             scanf("%d%d%d",&a,&b,&c);
    111             //if (flag[a][b]) continue;
    112             //flag[a][b]=1;
    113             add(b,a,c);
    114             add2(a,b,c);
    115         }
    116         scanf("%d%d%d",&from,&to,&K);
    117         spfa();
    118         int ans=A_star();
    119         printf("%d
    ",ans);
    120     }
    121     return 0;
    122 }
  • 相关阅读:
    redis.conf 配置信息:读取及修改命令
    Redis 持久化
    webpack 中,module、chunk、bundle 的区别(待补充)
    对象属性的描述:writable、enumerable、configurable
    webpack 中,importloaders 配置项的含义
    vue cli 3 中,Lint on save 与 Lint and fix on commit 区别(待补充)
    使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development、production)
    Eslint 能自动格式化代码,为什么还要用 Prettier?
    prettier-eslint 与 prettier-eslint-cli 区别
    032_nginx配置文件安全下载
  • 原文地址:https://www.cnblogs.com/huangxf/p/4362368.html
Copyright © 2020-2023  润新知