| ||||||||||
| 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 | |||||||||
这个程序是错的,居然AC(注意看~~~~~~~的部分)#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