點擊開啟連結
題目分析:
最短路徑,用dijkstra演算法可一個實現。就是多了限制條件。
用枚舉方法。
代碼;
#include<stdio.h>#include<cstring> #define max 1000000int n,m;int graph[105][105];int value[105],level[105],d[105];bool used[105],limit[105];int dijkstra(){int sum=max;int i,j;int k,dis;memset(used,0,sizeof(used));d[1]=0; //把起點初始化為零,符合實際。 for(i=2;i<=n;i++) //把未加入的點,賦值為無窮大,合理! d[i]=max; for(i=1;i<=n;i++){ k=0; dis=max; for(j=1;j<=n;j++) if(!used[j]&&d[j]<=dis&&limit[j]) //選取最小的點。 {k=j;dis=d[j]; }used[k]=true; //標記選取的點 for(j=1;j<=n;j++){ if(limit[j]&&d[j]>d[k]+graph[k][j]) //更新當前最短路 d[j]=d[k]+graph[k][j]; }}for(i=1;i<=n;i++){d[i]+=value[i];if(d[i]<sum) sum=d[i];}return sum;} int main(){int i,j,t,v,x,res=max;scanf("%d%d",&m,&n);for(i=0;i<=n;i++) for(j=0;j<=n;j++) if(i==j) graph[i][j]=0; else graph[i][j]=max; for(i=1;i<=n;i++) { scanf("%d%d%d",&value[i],&level[i],&x); for(j=1;j<=x;j++) { scanf("%d%d",&t,&v); graph[i][t]=v; } }for(i=0;i<=m;i++){ memset(limit,0,sizeof(limit)); for(j=1;j<=n;j++) if(level[j]>=level[1]-m+i&&level[j]<=level[1]+i) //枚舉 limit[j]=true; t=dijkstra(); if(res>t) res=t;}printf("%d\n",res);return 0;}