| ||||||||||
| 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 | |||||||||
spfa 为何就错了呢,那位闲的慌的大牛帮看看!!(附:spfa-dijkstra 用优先堆已过,但队列实现一直错)
#include <iostream>
#include <algorithm>
#include <queue>
#include <stdio.h>
#include <string.h>
/*#include <stack>*/
using namespace std;
#define EMAX 20010
#define VMAX 1010
#define inf ((1ll<<60) - 1)
int F[VMAX];
int c;
struct graph
{
struct edge
{
int c;
int v;
int next;
/* int interaction;*/
};
edge buf[EMAX];int e;
int point[VMAX];int n;
graph()
{
memset(point,-1,sizeof(point));
e = 0;
}
void add_edge(int u,int v,int c)
{
buf[e].v = v;
buf[e].next = point[u];
point[u] = e;
buf[e].c = c;
e++;
}
};
long long dis[VMAX][101];
struct SPFA:graph
{
struct node
{
int u,c;
// int len;
// bool operator<(const node &b)const
// {
// return len > b.len;
// }
};
bool spfa(int s,int t)
{
int i;
bool visit[VMAX][101];
// int times[VMAX][101];
for(i = 0; i < n; i++)
{
int j;
for(j = 0; j <= c; j++)
dis[i][j] = inf;visit[i][j] = true;/*times[i][j] = 0;*/
}
/*priority_*/queue<node> q;
dis[s][0] = 0;visit[s][0] = false;/*times[s][0] = 1;*/
node temp;
temp.u = s;
temp.c = 0;
/* temp.len = 0;*/
q.push(temp);
while(!q.empty())
{
node tmp = q.front();
q.pop();
visit[tmp.u][tmp.c] = true;
/* if(tmp.u == t) return true;*/
/* if(tmp.len > dis[tmp.u][tmp.c]) continue;*/
/*visit[tmp.u][tmp.c] = true;*/
int p = point[tmp.u];
while(p != -1)
{
if(tmp.c < buf[p].c){p = buf[p].next;continue;}
node temp;
temp.u = buf[p].v;
temp.c = tmp.c - buf[p].c;
if(dis[temp.u][temp.c] > dis[tmp.u][tmp.c])
{
dis[temp.u][temp.c] = dis[tmp.u][tmp.c];
/* temp.len = dis[temp.u][temp.c];*/
if(visit[temp.u][temp.c])
{
visit[temp.u][temp.c] = false;
q.push(temp);
}
}
p = buf[p].next;
}
if(tmp.c < c && dis[tmp.u][tmp.c+1] > dis[tmp.u][tmp.c] + F[tmp.u])
{
dis[tmp.u][tmp.c+1] = dis[tmp.u][tmp.c] + F[tmp.u];
node temp;
temp.u = tmp.u;
temp.c = tmp.c + 1;
/* temp.len = dis[temp.u][temp.c];*/
if(visit[temp.u][temp.c])
{
visit[temp.u][temp.c] = false;
q.push(temp);
}
}
}
return true;
}
};
SPFA g;
int main()
{
int m;
scanf("%d%d",&g.n,&m);
int i;
for(i = 0; i < g.n; i++) scanf("%d",&F[i]);
for(i = 0; i < m; i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
g.add_edge(x,y,z);
g.add_edge(y,x,z);
}
int q;
scanf("%d",&q);
while(q--)
{
int s,t;
scanf("%d%d%d",&c,&s,&t);
g.spfa(s,t);
if(dis[t][0] < inf) printf("%lld\n",dis[t][0]);
else printf("impossible\n");
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator