标签:++ 告诉 等于 水晶 tput ble 描述 情况 logs
题目网址:http://poj.org/problem?id=1062
题目:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 49916 | Accepted: 14961 |
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
题意:
交易物品,求花的最少金额数。限制条件是:等级相差m以上的不能交易(是全局,而不是单个交易)。注意到这一点的话,就可以枚举全局交易的等级区间,再依次求解,得最优解。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int inf=1111111111; 6 struct node{ 7 int money; 8 int lv; 9 }thing[105]; 10 int vis[105]; 11 int S[105]; 12 int m,n; 13 int mp[105][105]; 14 int dist[105]; 15 int dijkstra(){ 16 for(int i=1;i<=n;i++){ 17 dist[i]=thing[i].money;//初始化为每点没替换之前的价格 18 } 19 for(int i=0;i<n-1;i++){ 20 int Min=inf,u=-1; 21 for (int j=1; j<=n; j++) { 22 if(dist[j]<Min && vis[j] && !S[j]){ 23 Min=dist[j]; 24 u=j; 25 } 26 } 27 if(u==-1) break; 28 S[u]=1; 29 for (int j=1; j<=n; j++) { 30 if(dist[j]>dist[u]+mp[u][j] && vis[j]){ 31 dist[j]=dist[u]+mp[u][j]; 32 } 33 } 34 } 35 return dist[1]; 36 } 37 int main(){ 38 while (scanf("%d%d",&m,&n)!=EOF) { 39 for(int i=1;i<=n;i++){ 40 for (int j=1; j<=n; j++) { 41 mp[i][j]=inf; 42 } 43 } 44 for (int i=1; i<=n; i++) { 45 int x; 46 scanf("%d%d%d",&thing[i].money,&thing[i].lv,&x); 47 for (int j=0; j<x; j++) { 48 int a,b; 49 scanf("%d%d",&a,&b); 50 mp[a][i]=b; 51 } 52 } 53 int ans=thing[1].money; 54 for(int i=1;i<=thing[1].lv;i++){ 55 if(i+m<thing[1].lv) continue; 56 memset(vis, 0, sizeof(vis)); 57 memset(S, 0, sizeof(S)); 58 for(int j=1;j<=n;j++){ 59 if(thing[j].lv>=i && thing[j].lv<=i+m) vis[j]=1;//枚举区间 60 } 61 ans=min(ans,dijkstra()); 62 } 63 printf("%d\n",ans); 64 } 65 return 0; 66 }
POJ 1062 昂贵的聘礼(带限制条件的dijkstra)
标签:++ 告诉 等于 水晶 tput ble 描述 情况 logs
原文地址:http://www.cnblogs.com/uniles/p/7259050.html