Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
为什么总是wa,谁帮我看一下,不胜感激!!!思路:先找出酋长即物品(1)到每个物品的最小花费,然后有每个物品返回到物品1,若这条路径上的最高等级与最小等级的查大于M则舍弃这条路径,找出符合条件的最小值? 代码如下: #include<iostream> using namespace std; struct Goods { int price,rank,num; Goods(int p = 0,int r = 0,int n = 0):price(p),rank(r),num(n){} } goods[200]; int ABS(int num) { return num > 0?num:-num; } int map[200][200]; int father[200]; int dis[200]; bool visited[200]; int main() { int M,N,i,j,replace,price,k; cin >> M >> N; fill_n(visited,N + 1,false); fill_n(father,N + 1,0); for(i = 0; i <= N;i++) fill_n(map[i],N + 1,100000000); for(i = 1; i <= N;i++) { cin >> goods[i].price >> goods[i].rank >> goods[i].num; for(j = 0; j < goods[i].num;j++) { cin >> replace >> price; map[i][replace] = price; } } for(i = 1; i <= N;i++) dis[i] = map[1][i]; dis[1] = 0; visited[1] = true,father[1] = -1; for(i = 1; i < N;i++) { int mindis = 10000000,v = 0; for(j = 1; j <= N;j++) if(!visited[j]&&mindis > dis[j]) { mindis = dis[j]; v = j; } visited[v] = true; for(k = 1; k <= N;k++) if(!visited[k]&&dis[k] > dis[v] + map[v][k]) { father[k] =v; dis[k] = dis[v] + map[v][k]; } } int res = goods[1].price; for(k = 2;k <= N;k++) { int edge = 1,maxrank = goods[k].rank,minrank = goods[k].rank; int u = k; while(father[u] != -1&&ABS(maxrank - minrank) <= M) { if(maxrank < goods[u].rank) maxrank = goods[u].rank; if(minrank > goods[u].rank) minrank = goods[u].rank; edge++; if(father[u] == 0) break; u = father[u]; } if(/*edge >= goods[1].num&&*/ABS(maxrank - minrank) <= M) if(res > dis[k]) res = dis[k] + goods[k].price; } cout << res << endl; system("pause"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator