poj 2449 第K最短路-A*启发式搜索

http://poj.org/problem?id=2449

【题意】:给出一张有重复边的有向图,求其第k短路

【算法参考】:http://blog.sina.com.cn/s/blog_60707c0f010109q5.html

 

 

  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<queue>
  5 #define maxx 9999999
  6 using namespace std;
  7 
  8 
  9 struct edge{int v,l;};
 10 struct node{int g,v;};
 11 priority_queue<node > q;
 12 vector<edge> graph1[1002];
 13 vector<edge> graph2[1002];
 14 int d[1002],n,vis[1002];
 15 
 16 bool operator < (const node& a,const node& b)//  在优先队列中 用于比较的标准是s到当前点的实际距离+该点到t的最短路
 17 {
 18     return (a.g+d[a.v] > b.g+d[b.v]);
 19 }
 20 
 21 int dij(int s,int t)
 22 {
 23     memset(vis,0,sizeof(vis));
 24     for(int i=0;i<=n;i++)
 25         d[i]=maxx;
 26     d[t]=0;
 27     for(int i=0;i<n;i++)
 28     {
 29         int minn=maxx,k=1;
 30         for(int j=1;j<=n;j++)
 31             if(vis[j]==0&&minn>d[j])
 32              {
 33                  minn=d[j];
 34                  k=j;
 35              }
 36              vis[k]=1;
 37              for(int j=0;j<graph2[k].size();j++)
 38              {
 39                  int v;
 40                  v=graph2[k][j].v;
 41                  if(d[v]>graph2[k][j].l+d[k])
 42                     d[v]=graph2[k][j].l+d[k];
 43 
 44              }
 45     }
 46     if(d[s]==maxx)
 47        return 0;
 48     return 1;
 49 
 50 }
 51 
 52 int solve(int s,int t,int k)
 53 {
 54     node temp,temp2;
 55     temp.g=0;
 56     temp.v=s;
 57     q.push(temp);
 58     memset(vis,0,sizeof(vis));
 59     while(!q.empty())
 60     {
 61         temp=q.top(); q.pop();
 62         int vv;
 63         vv=temp.v;
 64         vis[vv]++;
 65         if(vis[vv]==k)
 66             return temp.g+d[vv];
 67 
 68         for(int i=0;i<graph1[vv].size();i++)
 69         {
 70             temp2.g=temp.g+graph1[vv][i].l;
 71             temp2.v=graph1[vv][i].v;
 72             q.push(temp2);
 73         }
 74 
 75     }
 76     return -1;
 77 }
 78 
 79 
 80 
 81 int main()
 82 {
 83     int i,j,s,t,k,m,a,b,c;
 84     while(~scanf("%d%d",&n,&m))
 85     {
 86         for(int i=0;i<=n;i++)
 87         {
 88             graph1[i].clear();
 89             graph2[i].clear();
 90         }
 91         while(m--)
 92         {
 93             scanf("%d%d%d",&a,&b,&c);
 94             edge temp;
 95             temp.v=b;temp.l=c;
 96             graph1[a].push_back(temp);
 97             temp.v=a;
 98             graph2[b].push_back(temp);//添加反向边 用于求每一点到t的最短路
 99         }
100         scanf("%d%d%d",&s,&t,&k);
101         if(s==t)   /////?????????????????特别注意 :当s==t时 最短路也不是0,一定要走!!!!!!!
102             k++;
103         if(dij(s,t)==0)
104             printf("-1");
105         else
106             printf("%d\n",solve(s,t,k));
107 
108     }
109     return 0;
110 }
posted @ 2014-07-18 10:46  galaxy77  阅读(213)  评论(0编辑  收藏  举报