| ||||||||||
| 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 | |||||||||
为啥加dijkstra堆优化之后次短路的值是错误的?我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#define inf 0x3fffffff
#define maxn 1005
#define maxe 1000005
using namespace std;
int first[maxn],n_ext[maxe],v[maxe],w[maxe],edge;
int st,e_nd,n,m;
struct node {
int pos,value;
bool pd;
bool operator < (const node &t) const {
return value > t.value;
}
};
priority_queue <node> q;
inline void add(int a,int b,int c) {
v[++edge] = b;
w[edge] = c;
n_ext[edge] = first[a];
first[a] = edge;
return ;
}
inline int dijkstra() {//special dijkstra
bool vis[maxn][2];
int d[maxn][2],cnt[maxn][2];
node tmp,put;
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
for(int i=0;i<=n;i++)d[i][0] = d[i][1] = inf;//memset(d,0x3f,sizeof(d));
while(!q.empty())q.pop();
d[st][0] = 0;cnt[st][0] = 1;tmp.pos = st,tmp.value = 0,tmp.pd = 0;
q.push(tmp);
while(!q.empty()) {
tmp = q.top();q.pop();//printf("%d\n",d[tmp.pos][tmp.pd]);
if(vis[tmp.pos][tmp.pd]||tmp.value>=inf)continue;
printf("d:%d\n",tmp.value);
vis[tmp.pos][tmp.pd] = 1;
for(int e=first[tmp.pos];e!=-1;e=n_ext[e]) {
if(d[v[e]][0] > d[tmp.pos][tmp.pd]+w[e]) {
d[v[e]][1] = d[v[e]][0];//注意这里,次短路变化
cnt[v[e]][1] = cnt[v[e]][0];
d[v[e]][0] = d[tmp.pos][tmp.pd]+w[e];
cnt[v[e]][0] = cnt[tmp.pos][tmp.pd];
put.pos = v[e];
put.value = d[v[e]][0];
put.pd = 0;
q.push(put);
put.pos = v[e];
put.value = d[v[e]][1];
put.pd = 1;
q.push(put);
}
else if(d[v[e]][0] == d[tmp.pos][tmp.pd]+w[e])
cnt[v[e]][0] += cnt[tmp.pos][tmp.pd];//已经入队
else if(d[v[e]][1] > d[tmp.pos][tmp.pd]+w[e]) {
d[v[e]][1] = d[tmp.pos][tmp.pd]+w[e];
cnt[v[e]][1] = cnt[tmp.pos][tmp.pd];
put.pos = v[e];
put.value = d[v[e]][1];
put.pd = 1;
q.push(put);
}
else if(d[v[e]][1] == d[tmp.pos][tmp.pd]+w[e])
d[v[e]][1] += cnt[tmp.pos][tmp.pd];
}
}
printf("1=%d,2=%d\n",d[e_nd][0],d[e_nd][1]);
if(d[e_nd][0]==d[e_nd][1]-1) return cnt[e_nd][0]+cnt[e_nd][1];
return cnt[e_nd][0];
}
inline void init() {
memset(first,-1,sizeof(first));
edge = 0;
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) {
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);//add(y,x,z);
}
scanf("%d%d",&st,&e_nd);
return ;
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
init();
printf("%d\n",dijkstra());
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator