MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 2449

Posted on 2011-11-09 20:38  MDeath-Kid  阅读(262)  评论(0)    收藏  举报

第K短路。

A*经典问题:

要求两点间的K短路,则图中一个点最多如队列K次(这些都是结论),

POJ 2449
#define MAXN 10005

constint INTMAX =0x7f7f7f7f;
int minl[MAXN],vis[MAXN];
int n, m, stx, sty, k, mark;
struct node {
int x;
int dis;
}u,s,v,t;
struct edge {
int v;
int dis;
}p;
vector
<edge> mat[10005];
vector
<edge> matT[10005];
priority_queue
<node> Q;

inline
booloperator< (const node a,const node b) {
return (a.dis + minl[a.x]) > (b.dis + minl[b.x]);
}


void bfs() {
if(stx == sty) k++;
if(minl[stx] >= INTMAX) {printf("-1\n");return ;}
SETQ(Q);
u.x
= stx,u.dis =0;
Q.push(u);
while(!Q.empty()) {
v
= Q.top();Q.pop();
//DB(v.x);
vis[v.x]++;
if(vis[sty] == k) {
printf(
"%d\n",v.dis + minl[v.x]);
return ;
}
if(vis[v.x] >k) continue;
for (int i =0;i<mat[v.x].size() ;i++ ) {
t.x
= mat[v.x][i].v;
t.dis
= v.dis + mat[v.x][i].dis;
Q.push(t);
}
}
printf(
"-1\n");
}

/*void dijstra() {
int v[MAXN],i, j, k;
for (i=0; i<=n;i++) {
minl[i] = INTMAX,v[i] = 0;
}
for (minl[sty]=0,j=0;j<n;j++) {
for ( k =-1,i=1;i<=n ;i++ ) {
if(!v[i]&&(k==-1||minl[i]<minl[k]))
k=i;
}
for (v[k] = 1,i = 1;i<=n ;i++ ) {
if(!v[i]&&(matt[k][i]!=-1))
minl[i]=min(minl[k]+matt[k][i],minl[i]);
}
}
}
*/

void spfa(int s) {
int i;
bool used[10005]; SET(used,false);
for (i =0;i<10005 ;i++ ) {
minl[i]
= INTMAX;
}
minl[s]
=0; used[s] =true;
queue
<int> q; q.push(s);
while(!q.empty()) {
int u = q.front();
q.pop(); used[u]
=false;
for (i =0;i< matT[u].size();i++ ) {
p
= matT[u][i];
if (minl[p.v] > minl[u] + p.dis) {
minl[p.v]
= minl[u] + p.dis;
if (!used[p.v]) {
used[p.v]
=true;
q.push(p.v);
}
}
}
}
}

void init() {
for (int i =0;i<10005 ;i++ ) {
mat[i].clear();
matT[i].clear();
}
SET(vis,
0);
int a,b,c;
for (int i=0; i<m;i++) {
SCFT(a,b,c);
p.v
= b;
p.dis
= c;
mat[a].push_back(p);
p.v
= a;
matT[b].push_back(p);
}
SCFT(stx,sty,k);
//DB(stx<<"--"<<sty<<"--"<<k);
spfa(sty);
}

int main() {
while (~SCFD(n,m)){
init();
bfs();
}
}