| ||||||||||
| 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 | |||||||||
AC ~~~~~~~~~~~~~~~~~~~~>>#include <cstdio>
#include <queue>
using namespace std;
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0' || c>'9'){if (c=='-')f=-1;c=getchar();}
while (c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();}
return x*f;
}
int print(int x)
{
if (x<0)x=-x,putchar('-');
if (x>9)print(x/10);
putchar(x%10+48);
}
int print(int x,char c)
{
print(x);
putchar(c);
}
const int INF=100000000;
const int MAXN=1010;
const int MAXM=100010;
int n,m,id[2],from,to,k;
struct edge
{
int v,w,nx;
}set[2][MAXM];
int head[2][MAXN];
int dis[MAXN];
bool vis[MAXN];
struct dij
{
int id,dis;
bool operator < (const dij tmp) const
{
return dis>tmp.dis;
}
};
struct star
{
int id,f,g;
bool operator < (const star tmp) const
{
if (f==tmp.f)return g>tmp.g;
return f>tmp.f;
}
};
inline void Addedge(int cnt,int u,int v,int w)
{
id[cnt]++;set[cnt][id[cnt]].v=v;set[cnt][id[cnt]].w=w;set[cnt][id[cnt]].nx=head[cnt][u];
head[cnt][u]=id[cnt];
}
inline void dijkstra(int s)
{
priority_queue<dij> Q;
for (int i=1;i<=n;i++)dis[i]=INF;
dis[s]=0;
Q.push((dij){s,0});
struct dij top;
int u,v,w;
while (!Q.empty())
{
u=Q.top().id;
Q.pop();
vis[u]=0;
for (int k=head[1][u];k>0;k=set[1][k].nx)
{
v=set[1][k].v;w=set[1][k].w;
if (dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
if (!vis[v])
{
vis[v]=true;
Q.push((dij){v,dis[v]});
}
}
}
}
}
inline void init()
{
int u,v,w;
n=read();m=read();
for (int i=1;i<=m;i++)
{
u=read();v=read();w=read();
Addedge(0,u,v,w);
Addedge(1,v,u,w);
}
from=read();to=read();k=read();
dijkstra(to);
}
inline int A_star(int cnt)
{
priority_queue<star> Q;
if (from==to)cnt++;
Q.push((star){from,0,0});
struct star top;
while (!Q.empty())
{
top=Q.top();Q.pop();
if (top.id==to)
if ((--cnt)==0)
return top.f;
for (int k=head[0][top.id];k>0;k=set[0][k].nx)
Q.push((star){set[0][k].v,top.g+set[0][k].w+dis[set[0][k].v],top.g+set[0][k].w});
}
return -1;
}
int main()
{
init();
print(A_star(k));
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator