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 |
哪位大牛帮我看看,为什么总是RE啊?#include <stdio.h> #include <stdlib.h> const int maxv=1010; const int INF=36000; int vn,en; int cost[maxv][maxv]; bool flag; struct { int u; int v; }edge[10010]; void init() { for(int i=1;i<=vn;i++) for(int j=1;j<=vn;j++) cost[i][j]=INF; } void change(int pre[],int k) { if(pre[k]==k) return ; cost[pre[k]][k]=INF; cost[k][pre[k]]=0-cost[k][pre[k]]; change(pre,pre[k]); } int dijkstra() { int *dist=new int[maxv]; int *pre=new int[maxv]; int s[maxv]; int i,j,u,mindis; for(i=1;i<=vn;i++){ s[i]=0; dist[i]=cost[1][i]; if(dist[i]<INF) pre[i]=1; else pre[i]=-1; } s[1]=1; pre[1]=1; for(i=1;i<vn;i++){ mindis=INF; u=-1; for(j=1;j<=vn;j++) if(!s[j]&&dist[j]<mindis){ mindis=dist[j]; u=j; } s[u]=1; for(j=1;j<=vn;j++) if(s[j]==0) if(cost[u][j]<INF&&dist[j]>dist[u]+cost[u][j]){ dist[j]=dist[u]+cost[u][j]; pre[j]=u; } } int c=dist[vn]; change(pre,vn); delete []dist; delete []pre; return c; } void relax(int dist[],int u,int v) { if(dist[v]>dist[u]+cost[u][v]) dist[v]=dist[u]+cost[u][v]; } int bf() { int *dist=new int [maxv]; int i,j; for(i=1;i<=vn;i++) dist[i]=cost[1][i]; flag=true; for(i=1;i<vn&&flag;i++){ for(j=0;j<en;j++) relax(dist,edge[j].u,edge[j].v); for(j=0;j<en;j++) if(dist[edge[j].v]>dist[edge[j].u]+cost[edge[j].u][edge[j].v]){ flag=false; break; } } int c=dist[vn]; delete []dist; return c; } int main(void) { int min; while(scanf("%d%d",&vn,&en)==2){ int u,v,w; init(); for(int i=0;i<en;i++){ scanf("%d%d%d",&u,&v,&w); edge[i].u=u; edge[i].v=v; cost[u][v]=cost[v][u]=w; } min=dijkstra(); min+=bf(); printf("%d\n",min); } return 0 ; } 第一遍是用Dijkstra搜的最短路径,反向后第二次用bellman_ford搜的最短路径。 Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator