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啊,我测试了n组数据了#include<iostream> #include<math.h> using namespace std; const int N = 101; const long infinit = 4000000; typedef struct Money { long P; int L,X; }Money; Money money[N]; bool ttry(int path[],int w,int n,int m) { int t; while(w > 0) { t = abs(money[w].L-money[n].L); if (t>m) { return false; } w = path[w]; } return true; } int main() { long G[N][N]; int i,j,m,n,t1,t2,min,w,h; int mark[N],d[N],path[N]; while(cin >> m >> n) { for ( i = 1; i <= n ; i++) { path[i] = 1; d[i] = infinit; mark[i] = 0; } path[1] = 0; for ( i = 1; i <= n; i++) for (j = 1; j<= n; j++) { G[i][j] = infinit; if (i==j) { G[i][j] = 0; } } for (i = 1; i <= n; i++) { cin >> money[i].P; cin >> money[i].L; cin >> money[i].X; for (j = 1; j<= money[i].X;j++) { cin >> t1; cin >> t2; G[i][t1] = t2; //G[t1][i] = t2; } } for (i = 1;i <= n; i++) if (G[1][i]!=infinit&&ttry(path,1,i,m)==true) { d[i] = G[1][i]+money[i].P; } mark[1] = 1; for (i = 2; i <= n; i++) { min = infinit; w = 1; for (j = 2; j <= n; j++) if (mark[j]==0&&min>d[j]) { min = d[j]; w = j; } mark[w] = 1; for (j = 1; j <= n; j++) if(ttry(path,w,j,m)==true) if (mark[j]==0&&G[w][j]<infinit&&(d[j]>d[w]-money[w].P+G[w][j]+money[j].P)) { d[j] = d[w]-money[w].P+G[w][j]+money[j].P; path[j] = w; } } for(i = 2; i <= n; i++) if (d[i]<d[1]) { d[1] = d[i]; } cout << d[1] ; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator