中文题,题意就不多说了,讲讲思路吧,先根据题意构图,与普通最短路不同的是这一题加了一个Rank,每个点都有一个Rank,题目要求最短路径上的点的Rank的最大差值在
M范围内,Dijkstra判断条件时加上Rank约束就行了。我没有添加汇点直接写的,另贴上别人添加汇点的写法。
我的代码:
#include别人添加会点的代码:#include #include #include #include #include #include
http://www.cnblogs.com/yongze103/archive/2010/08/19/1803757.html
#includeusing namespace std;int M,N,dengji[110];int dis[110],map[110][110];bool vis[110];void dijkstra(int m,int n){ int i,k,num=1; int min; memset(vis,0,sizeof(vis)); memset(dis,127,sizeof(dis)); vis[0]=1; for(i=0;i<=N;i++) if( dengji[i]>=m && dengji[i]<=n) dis[i]=map[0][i]; k=0; while(1) { min=99999999; for(i=0;i<=N;i++) if(dengji[i]>=m && dengji[i]<=n && !vis[i] && min>dis[i]) { min=dis[i]; k=i; } vis[k]=1; if(k==1) return; for(i=0;i<=N;i++) if( dengji[i]>=m && dengji[i]<=n && !vis[i] && dis[i]>dis[k]+map[k][i]) { dis[i]=dis[k]+map[k][i]; } }}int main(){ int i,j,k,t,p; memset(map,127,sizeof(map)); cin>>M>>N; int ans=999999999; for(i=1;i<=N;i++) { scanf("%d%d%d",&map[0][i],&dengji[i],&k); for(j=1;j<=k;j++) { scanf("%d%d",&t,&p); map[t][i]=p; } } for( i=dengji[1]-M; i<=dengji[1]; i++) { dijkstra(i,i+M); if(ans>dis[1]) ans=dis[1]; } cout< <