|
Posted on
2013-05-01 18:12
fengyv
阅读( 640)
评论()
编辑
收藏
举报
[cpp]
view plain
copy
print
?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<queue>
- #include<cstdio>
- #include<climits>
- #include<algorithm>
- using namespace std;
-
- const int INF=0xffffff;
- const int N=1010;
- const int M=100010;
-
- struct node1
- {
- int to;
- int w;
- int next;
- };
-
- node1 edge1[M],edge2[M];
- int head1[M],head2[M];
- int idx1,idx2;
- int dist[N];
-
- struct node2
- {
- int to;
-
- int g,f;
- bool operator<(const node2 &r ) const
- {
- if(r.f==f)
- return r.g<g;
- return r.f<f;
- }
- };
-
- void Addedge1(int u,int v,int w)
- {
- edge1[idx1].w=w;
- edge1[idx1].to=v;
- edge1[idx1].next=head1[u];
- head1[u]=idx1++;
- }
-
- void Addedge2(int u,int v,int w)
- {
- edge2[idx2].w=w;
- edge2[idx2].to=v;
- edge2[idx2].next=head2[u];
- head2[u]=idx2++;
- }
-
- bool SPFA(int s,int n,int head[],node1 edge[],int dist[])
- {
- queue<int>Q1;
- int inq[N];
- for(int i=0; i<=n; i++)
- {
- dist[i]=INF;
- inq[i]=0;
- }
- dist[s]=0;
- Q1.push(s);
- inq[s]++;
- while(!Q1.empty())
- {
- int q=Q1.front();
- Q1.pop();
- inq[q]--;
- if(inq[q]>n)
- return false;
- int k=head[q];
- while(k>=0)
- {
- if(dist[edge[k].to]>dist[q]+edge[k].w)
- {
- dist[edge[k].to]=edge[k].w+dist[q];
- if(!inq[edge[k].to])
- {
- inq[edge[k].to]++;
- Q1.push(edge[k].to);
- }
- }
- k=edge[k].next;
- }
- }
- return true;
- }
-
- int A_star(int s,int t,int n,int k,int head[],node1 edge[],int dist[])
- {
- node2 e,ne;
- int cnt=0;
- priority_queue<node2>Q;
- if(s==t)
- k++;
- if(dist[s]==INF)
- return -1;
- e.to=s;
- e.g=0;
- e.f=e.g+dist[e.to];
- Q.push(e);
-
- while(!Q.empty())
- {
- e=Q.top();
- Q.pop();
- if(e.to==t)
- {
- cnt++;
- }
- if(cnt==k)
- {
- return e.g;
- }
- for(int i=head[e.to]; i!=-1; i=edge[i].next)
- {
- ne.to=edge[i].to;
- ne.g=e.g+edge[i].w;
- ne.f=ne.g+dist[ne.to];
- Q.push(ne);
- }
- }
- return -1;
- }
-
- int main()
- {
- int n,m;
-
- while(~scanf("%d%d",&n,&m))
- {
- memset(head1, -1, sizeof(head1));
- memset(head2, -1, sizeof(head2));
- idx1=idx2=0;
- int u,v,w;
- for(int i=0; i<m; i++)
- {
- scanf("%d%d%d",&u,&v,&w);
- Addedge1(u,v,w);
- Addedge2(v,u,w);
- }
- int s,t,k;
- scanf("%d%d%d",&s,&t,&k);
- SPFA(t,n,head2,edge2,dist);
- int res=A_star(s,t,n,k,head1,edge1,dist);
- printf("%d\n",res);
- }
- return 0;
- }
|