您的位置:首页 > 其它

HDU 1690 Bus System (最短路径bellmamford算法)

2010-10-29 19:58 453 查看
把题目理解后就可以构造图,形成求解最短路径,可以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);
}
}
}


最近进步很大,不过又有些颓废了,还是要继续加油啊!

杭电的最短路径都快被我切圆了,继续加油吧!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  system 算法 c 测试