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 |
这个,没什么特别的吧In Reply To:这个程序是错的,居然AC(注意看~~~~~~~的部分) Posted by:NinjaQ at 2005-11-29 23:21:32 > #include <iostream.h> > > struct junct_info > { > int Ci; > int ric; > int tiB; > int tiP; > int pre; > int time; > }; > > struct junct > { > int time; > int id; > }; > > junct_info jt[300]; > int map[300][300]; > int visit[300]; > > junct* heap; > int heapsize; > > //返回在t时刻,从j1驶向j2所需最少等待时间 > int wait( int time, junct_info j1, junct_info j2) > { > int c1, r1, c2, r2; > int t1, t2; > if ( time < j1.ric ) > { > c1 = j1.Ci; > r1 = j1.ric - time; > } > else > { > t1 = ( time - j1.ric ) % ( j1.tiB + j1.tiP ); > if ( j1.Ci == 0 ) > { > if ( t1 < j1.tiP ) > { > c1 = 1; > r1 = j1.tiP - t1; > } > else > { > c1 = 0; > r1 = j1.tiP + j1.tiB - t1; > } > } > else > { > if ( t1 < j1.tiB ) > { > c1 = 0; > r1 = j1.tiB - t1; > } > else > { > c1 = 1; > r1 = j1.tiP + j1.tiB - t1; > } > } > } > > if ( time < j2.ric ) > { > c2 = j2.Ci; > r2 = j2.ric - time; > } > else > { > t2 = ( time - j2.ric ) % ( j2.tiB + j2.tiP ); > if ( j2.Ci == 0 ) > { > if ( t2 < j2.tiP ) > { > c2 = 1; > r2 = j2.tiP - t2; > } > else > { > c2 = 0; > r2 = j2.tiP + j2.tiB - t2; > } > } > else > { > if ( t2 < j2.tiB ) > { > c2 = 0; > r2 = j2.tiB - t2; > } > else > { > c2 = 2; > r2 = j2.tiP + j2.tiB - t2; > } > } > } > > if ( c1 == c2 ) > return 0; > else if ( r1 != r2 ) > return ( r1 < r2 ) ? r1 : r2; > else if ( c1 == 0 ) > { > if ( j1.tiP != j2.tiB ) > return r1 + (( j1.tiP < j2.tiB ) ? j1.tiP : j2.tiB); > else if ( j1.tiB != j2.tiP ) > return r1 + j1.tiP + ( j1.tiB < j2.tiP ) ? j1.tiB : j2.tiP; > else > return -1; > } > else > { > if ( j1.tiB != j2.tiP ) > return r1 + ( j1.tiB < j2.tiP ) ? j1.tiB : j2.tiP; > else if ( j1.tiP != j2.tiB ) > return r1 + j1.tiB + ( j1.tiP < j2.tiB ) ? j1.tiP : j2.tiB; > else > return -1; > } > } > > //add a element into heap > void heap_insert( junct j) > { > int i, c; > i = heapsize; > heapsize++; > while( i > 0 ) > { > c = ( i - 1 ) / 2; > if ( heap[c].time < j.time ) > break; > heap[i].id = heap[c].id; > heap[i].time = heap[c].time; > i = c; > } > heap[i].id = j.id; > heap[i].time = j.time; > } > > //delete the min-element from the heap > junct heap_delmin() > { > int i, c; > junct ret; > ret.id = heap[0].id; > ret.time = heap[0].time; > heapsize--; > i = 0; > while( i < heapsize / 2 ) > { > c = i * 2 + 1; > if ( c + 1 < heapsize && heap[c].time > heap[c+1].time ) > c++; > if ( heap[heapsize].time < heap[c].time ) > break; > heap[i].id = heap[c].id; > heap[i].time = heap[c].time; > i = c; > } > heap[i].id = heap[heapsize].id; > heap[i].time = heap[heapsize].time; > return ret; > } > > void main() > { > int src, des; > int n, m; > int i, id1, id2, k, d, index; > char c; > junct j, j1; > bool found; > int path[300], pathlen; > > cin >> src >> des; > src--; > des--; > cin >> n >> m; > for ( i = 0; i < n; i++) > { > cin >> c >> jt[i].ric >> jt[i].tiB >> jt[i].tiP; > if ( c == 'B' ) > jt[i].Ci = 0; > else > jt[i].Ci = 1; > jt[i].pre = -1; > jt[i].time = -1; > visit[i] = 0; > } > for ( i = 0; i < n; i++) > for ( k = 0; k < n; k++) > map[i][k] = 0; > for ( i = 0; i < m; i++) > { > cin >> id1 >> id2; > cin >> map[id1-1][id2-1]; > map[id2-1][id1-1] = map[id1-1][id2-1]; > } > > heap = new junct[m]; > heapsize = 0; > > j.id = src; > j.time = jt[src].time = 0; > heap_insert(j); > > for ( i = 0; i < n; i++) > { > found = 0; > while( heapsize > 0 ) > { > j = heap_delmin(); > if ( visit[j.id] == 0 ) > { > found = 1; > break; > } > } > if ( !found ) > break; > > if ( j.id == des ) > break; > > visit[j.id] = 1; > > for ( k = 0; k < n; k++) > { > if ( visit[k] == 0 && map[k][j.id] != 0 ) > { > d = wait( j.time, jt[j.id], jt[k]); > if ( d == -1 ) > continue; > if ( j.time + d < jt[k].time || jt[k].time == -1) > { //~~~~~~~~~~~~~~~~~~~~~~~ > j1.id = k; > j1.time = j.time + d + map[k][j.id]; > jt[k].time = j1.time; > jt[k].pre = j.id; > heap_insert(j1); > } > } > } > } > > if ( j.id == des ) > { > cout << j.time << endl; > } > else > cout << 0 << endl; > delete[]heap; > } > > > > > > Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator