| ||||||||||
| 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 | |||||||||
Bellman_Ford最短路径,附源代码#include<iostream>
using namespace std;
const int MAX=100;
const int INF=1<<28;
struct Edge{
int x,y,w;
};
struct Point{
int P,L;
int minlevel,maxlevel;
};
Point point[MAX+1];
Edge edge[MAX*MAX+1];
int n,M,m;
int lowcase[MAX+1];
void init(int start){
for(int i=1;i<=n;i++)
{
lowcase[i]=INF;
point[i].minlevel=point[i].L-M;
point[i].maxlevel=point[i].L+M;
}
lowcase[1]=0;
}
bool relax(Edge e){
if(lowcase[e.y]>lowcase[e.x]+e.w&&point[e.y].L>=point[e.x].minlevel&&point[e.y].L<=point[e.x].maxlevel)
{
lowcase[e.y]=lowcase[e.x]+e.w;
point[e.y].minlevel=max(point[e.y].minlevel,point[e.x].minlevel);
point[e.y].maxlevel=min(point[e.y].maxlevel,point[e.x].maxlevel);
return true;
}
return false;
}
int Bellman_Ford(int start,int end){
int i,j;
bool flag;
init(start);
for(i=1;i<n;i++)
{
flag=false;
for(j=1;j<=m;j++)
flag=relax(edge[j]);
if(!flag)
break;
}
return 1;
}
int main(){
int i,j;
int a,b,c,res;
while(cin>>M>>n)
{
m=1;
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);
point[i].P=a;
point[i].L=b;
for(j=1;j<=c;j++)
{
scanf("%d%d",&a,&b);
edge[m].x=i;
edge[m].y=a;
edge[m].w=b;
m++;
}
}
m--;
Bellman_Ford(1,n);
res=INF;
for(i=1;i<=n;i++)
res=min(res,lowcase[i]+point[i].P);
cout<<res<<endl;
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator