标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 39976 | Accepted: 11596 |
Description
Input
Output
Sample Input
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
Sample Output
5250
这题可以利用Dijkstra求最短路径得出,例子中的图可以用下图表示:
关于等级限制,可以利用枚举的方法,例如酋长等级为l,等级限制为m,则可以枚举[l-m,l]一直到[l,l+m]
1 #include <iostream> 2 #include<limits.h> 3 #include<algorithm> 4 using namespace std; 5 int map[101][101],vis[101],level[101],dis[101]; 6 int level_gap,num; 7 int min_cost; 8 int Dijkstra(){ 9 for(int i=1;i<=num;i++){ 10 dis[i]=map[0][i]; 11 } 12 for(int i=0;i<=num;i++){ 13 int min_dis=INT_MAX; 14 int ind=0; 15 for(int j=0;j<=num;j++){ 16 if((!vis[j])&&(dis[j]<min_dis)){ 17 min_dis=dis[j]; 18 ind=j; 19 } 20 } 21 vis[ind]=1; 22 if(min_dis==INT_MAX) 23 break; 24 for(int j=0;j<=num;j++){ 25 if(!vis[j]&&map[ind][j]!=INT_MAX){ 26 if(map[ind][j]+dis[ind]<dis[j]){ 27 dis[j]=dis[ind]+map[ind][j]; 28 } 29 } 30 } 31 } 32 return dis[1]; 33 } 34 int main() { 35 36 cin>>level_gap>>num; 37 for(int i=0;i<=num;i++){ 38 for(int j=0;j<=num;j++){ 39 map[i][j]=INT_MAX; 40 } 41 } 42 dis[0]=0; 43 min_cost=INT_MAX; 44 for(int i=1;i<=num;i++){ 45 int value,lev,rep_num; 46 cin>>value>>lev>>rep_num; 47 map[0][i]=value; 48 level[i]=lev; 49 for(int j=0;j<rep_num;j++){ 50 int n; 51 cin>>n>>value; 52 map[n][i]=value; 53 } 54 } 55 for(int i=level[1]-level_gap;i<=level[1];i++){ 56 for(int j=1;j<=num;j++){ 57 if(level[j]>=i&&level[j]<=i+level_gap){ 58 vis[j]=0; 59 }else{ 60 vis[j]=1; 61 } 62 vis[0]=1; 63 } 64 min_cost=min(min_cost,Dijkstra()); 65 } 66 cout<<min_cost<<endl; 67 return 0; 68 }
昂贵的聘礼 - poj 1062 (Dijkstra+枚举)
标签:
原文地址:http://www.cnblogs.com/sdxk/p/4629693.html