中文题,题意就不多说了,讲讲思路吧,先根据题意构图,与普通最短路不同的是这一题加了一个Rank,每个点都有一个Rank,题目要求最短路径上的点的Rank的最大差值在
M范围内,Dijkstra判断条件时加上Rank约束就行了。我没有添加汇点直接写的,另贴上别人添加汇点的写法。
我的代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define maxn 1005 #define MAXN 2005 #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 typedef long long ll; using namespace std; int mp[110][110]; int visit[110],dist[110],selfcost[110],Rank[110]; int M,N; int Dijkstra(int s,int e) { int i,j,now,mi; memset(visit,0,sizeof(visit)); memset(dist,INF,sizeof(dist)); for (i=1;i<=N;i++) if (Rank[i]>=s&&Rank[i]<=e) dist[i]=mp[1][i]; dist[1]=0; visit[1]=1; for (i=1;i<=N;i++) { now=-1; mi=INF; for (j=1;j<=N;j++) { if (Rank[j]>=s&&Rank[j]<=e&&!visit[j]&&dist[j]<mi) { now=j; mi=dist[j]; } } if (now==-1) break; visit[now]=1; for (j=1;j<=N;j++) { if (Rank[j]>=s&&Rank[j]<=e&&!visit[j]&&mp[now][j]<INF&&dist[j]>dist[now]+mp[now][j]) dist[j]=dist[now]+mp[now][j]; } } int minn=INF; for (i=1;i<=N;i++) { // printf("%d\n",dist[i]); if (dist[i]+selfcost[i]<minn) minn=dist[i]+selfcost[i]; } return minn; } int main() { int i,j; while (scanf("%d%d",&M,&N)!=EOF) { for (i=1;i<=N;i++) for (j=1;j<=N;j++) { if (i==j) mp[i][j]=0; else mp[i][j]=INF; } for (i=1;i<=N;i++) { int X; scanf("%d%d%d",&selfcost[i],&Rank[i],&X); while (X--) { int y,w; scanf("%d%d",&y,&w); mp[i][y]=w; } } int minn=INF; for (int i=Rank[1]-M;i<=Rank[1];i++) { int xxx=Dijkstra(i,i+M); if (xxx<minn) minn=xxx; } printf("%d\n",minn); } return 0; }
别人添加会点的代码:
http://www.cnblogs.com/yongze103/archive/2010/08/19/1803757.html
#include<iostream> using 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<<ans<<endl; return 0; }
时间: 2024-10-26 05:19:14