poj1661——Help Jimmy//最短路

思路:转化为求最短路。建图比较麻烦,每一个平台拆成两个点,上下两个平台之间距离不超过maxlen的点加边。

#include #include #include #include using namespace std; #define maxn 2100 #define maxcost 99999999 int maxlen,sx,sh,n,st,ed; class node { public: int lx,rx,h; }; node p[1005]; class map { public : int to,len; int next; }; map g[10000]; int head[2100],cnt; bool cmp(node &a,node &b) { if(a.h >b.h )return true; return false; }; void add(int u,int v,int len) { g[++cnt].to =v; g[cnt].len =len; g[cnt].next=head[u]; head[u]=cnt; } void build()//建图 { int i,j; for(i=0;i=p[i].lx &&l==false) { l =true; add(2*i,2*j,p[i].lx -p[j].lx ); add(2*i,2*j+1,p[j].rx -p[i].lx ); } if(p[j].lx <=p[i].rx &&p[j].rx >=p[i].rx &&r==false) { r=true; add(2*i+1,2*j,p[i].rx -p[j].lx ); add(2*i+1,2*j+1,p[j].rx -p[i].rx ); } j++; } if(p[i].h <=maxlen) { if(l==false) add(2*i,ed,0); if(r==false) add(2*i+1,ed,0); } } } int vis[maxn],dist[maxn],par[maxn]; int dij() { int i,min,k,j,dis,v; for(i=0;i<=ed;i++) { vis[i]=0; par[i]=0; dist[i]=maxcost; } for(i=head[st];i;i=g[i].next ) { v=g[i].to ; dist[v]=g[i].len ; } vis[st]=1;dist[st]=0; for(i=0;i<=ed;i++) { min=maxcost;k=st; for(j=0;j<=ed;j++) if(dist[j]dis) { dist[v]=dis; par[v]=k; } } } return dist[ed]; } int main() { int test,i; cin>>test; while(test--) { cin>>n>>sx>>sh>>maxlen; for(i=0;i=sx) { add(st,2*i,sx-p[i].lx ); add(st,2*i+1,p[i].rx -sx); break; } i++; } if(i==n) printf("%d/n",sh); else { build(); printf("%d/n",dij()+sh); } } return 0; }

你可能感兴趣的:(省赛之后,build,平台,ini,class)