把题目理解后就可以构造图,形成求解最短路径,可以bellmanford算法求单元最短路径,当然也可以用floyd算法求点对的最短路径,但是相比起来,floyd更快一点吧!ke可能是因为给的测试数据更多点额是点对的求最短路径!!
同时要注意要用long long型,不然就挂惨喽!
下面是代码,给出的事Bellmanford算法,Floyd比较容易实现!
#include<iostream> #include<cstdlib> #include<stdio.h> #include<math.h> using namespace std; const long long inf=0x7f7f7f7f7f7f7f7fLL,Max=106; long long Map[Max][Max],d[Max],p[Max]; long long l[5],c[5]; long long bellmanford(int n,int s,int e) { int i,j,k,index; for(i=1;i<=n;i++) d[i]=inf; d[s]=0; for(k=1;k<n;k++) { index=0; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(Map[i][j]<inf&&d[i]<inf) { if(d[j]>Map[i][j]+d[i]) { d[j]=Map[i][j]+d[i]; index=1; } } } } if(index==0) break; } return d[e]; } int main() { int T,n,m,i,j,cas,s,e; long long dis,ans; scanf("%d",&T); for(cas=1;cas<=T;cas++) { for(i=1;i<=4;i++) scanf("%I64d",&l[i]); for(i=1;i<=4;i++) scanf("%I64d",&c[i]); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(i==j) Map[i][j]=0; else Map[i][j]=inf; } for(i=1;i<=n;i++) { scanf("%I64d",&p[i]); for(j=1;j<i;j++) { dis=abs(p[i]-p[j]); if(0<dis&&dis<=l[1]) Map[i][j]=Map[j][i]=c[1]; if(dis>l[1]&&dis<=l[2]) Map[i][j]=Map[j][i]=c[2]; if(dis>l[2]&&dis<=l[3]) Map[i][j]=Map[j][i]=c[3]; if(dis>l[3]&&dis<=l[4]) Map[i][j]=Map[j][i]=c[4]; } } printf("Case %d:/n",cas); while(m--) { scanf("%d%d",&s,&e); ans=bellmanford(n,s,e); if(ans<inf) printf("The minimum cost between station %d and station %d is %I64d./n",s,e,ans); else printf("Station %d and station %d are not attainable./n",s,e); } } }
最近进步很大,不过又有些颓废了,还是要继续加油啊!
杭电的最短路径都快被我切圆了,继续加油吧!!!