| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
直接用优先队列290ms#include <iostream>
#include <cmath>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct node{
int to,len;
};
bool operator<(const node&a,const node&b)
{
return a.len>b.len;
};
struct node2{
int f,g,h,to;
};
bool operator<(const node2&a,const node2&b)
{
return a.f>b.f;
};
priority_queue<node>q;
priority_queue<node2>q2;
const int maxn=1010;
int dis[maxn];
int fir1[maxn],next1[100*maxn],to1[100*maxn],len1[100*maxn];
int fir2[maxn],next2[100*maxn],to2[100*maxn],len2[100*maxn];
int s,target,k,d;
const int inf=99999999;
int n,m;
void dijkstra()
{
bool done[maxn];
for(int i=1;i<=n;i++)dis[i]=inf;
dis[target]=0;
memset(done,0,sizeof(done)) ;
node temp;
temp.to=target;
temp.len=0;
q.push(temp);
while(!q.empty())
{
temp=q.top();
q.pop();
if(done[temp.to])continue;
done[temp.to]=1;
for(int e=fir1[temp.to];e!=-1;e=next1[e])if(dis[to1[e]]>dis[temp.to]+len1[e])
{
dis[to1[e]]=dis[temp.to]+len1[e];
node temp2;
temp2.len=dis[to1[e]];
temp2.to=to1[e];
q.push(temp2);
}
}
}
int Astar()
{
int cnt[maxn];
memset(cnt,0,sizeof(cnt));
if(dis[s]==inf)return-1;
node2 temp;
temp.to=s;temp.g=0;temp.h=dis[s];temp.f=temp.g+temp.h;
q2.push(temp);
while(q2.empty()==0)
{
temp=q2.top();
q2.pop();
cnt[temp.to]++;
if(cnt[target]==k)return temp.f;
if(cnt[temp.to]>k)continue;
node2 temp2;
for(int e=fir2[temp.to];e!=-1;e=next2[e])
{
temp2.g=temp.g+len2[e];
temp2.h=dis[to2[e]];
temp2.f=temp2.g+temp2.h;
temp2.to=to2[e];
q2.push(temp2);
}
}
return -1;
}
int main()
{
scanf("%d%d",&n,&m);
memset(fir1,-1,sizeof(fir1));
memset(fir2,-1,sizeof(fir2));
int num1=0;
int num2=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&s,&target,&d);
len1[num1]=d;to1[num1]=s;next1[num1]=fir1[target];fir1[target]=num1++;
len2[num2]=d;to2[num2]=target;next2[num2]=fir2[s];fir2[s]=num2++;
}
scanf("%d%d%d",&s,&target,&k);
dijkstra();
if(s==target)k++;
printf("%d\n",Astar());
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator