| ||||||||||
| 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 | |||||||||
I have encountered the same problem. By using DIJ + heap, I still have TLE.In Reply To:死都不甘心. Posted by:whd0810 at 2008-09-28 20:35:31 Perhaps the reason for getting TLE is because I have used some code from STL in my code. However, I dont think that is gonna make my program TLE. Any suggestions? Guys?
#include <iostream>
#include <vector>
using namespace std;
const int SIZE = 30001;
const int INFINITE = 0x7f7f7f7f;
class Edge
{
public:
int w, node;
public:
Edge ()
{
Edge ( 0, 0 );
}
Edge ( int a, int b )
{
w = a;
node = b;
}
bool operator < ( const Edge b )
{
return this->w < b.w;
}
};
class Minheap
{
private:
Edge nodes[SIZE];
public:
int size;
Minheap ()
{
size = 0;
}
private:
void swap ( Edge& a, Edge& b )
{
Edge t = a;
a = b;
b = t;
}
void heapfy ( int );
public:
void push ( Edge );
void pop ();
Edge front ()
{
return nodes[1];
}
};
void Minheap::push( Edge edge )
{
size++;
nodes[size] = edge;
int i = size;
while ( i > 1 && ( nodes[i] < nodes[i / 2] ) )
{
swap ( nodes[i / 2], nodes[i] );
i = i / 2;
}
}
void Minheap::pop()
{
if ( size < 1 )
return;
nodes[1] = nodes[size];
size--;
heapfy ( 1 );
}
void Minheap::heapfy( int index )
{
int l = index * 2, r = l + 1, smaller = index;
if ( l <= size && nodes[l] < nodes[index] )
smaller = l;
if ( r <= size && nodes[r] < nodes[smaller] )
smaller = r;
if ( smaller != index )
{
swap ( nodes[smaller], nodes[index] );
heapfy ( smaller );
}
}
int dist[SIZE], n, m;
bool used[SIZE];
class Graph
{
public:
vector <Edge> adj[SIZE];
public:
void addnode ( int, int, int );
};
void Graph::addnode ( int s, int t, int w )
{
Edge edge ( w, t );
adj[s].push_back( edge );
}
Graph graph;
Minheap heap;
void read()
{
// freopen ( "3159.txt", "r", stdin );
scanf ( "%d%d", &n, &m );
int s, t, w;
for ( int i = 0; i < m; i++ )
{
scanf ( "%d%d%d", &s, &t, &w );
graph.addnode( s, t, w );
}
}
void dijtra ()
{
memset ( dist, 0x7f, sizeof ( dist ) );
memset ( used, false, sizeof ( used ) );
Edge first ( 0, 1 );
heap.push ( first );
dist[first.node] = 0;
while ( heap.size >= 1 )
{
Edge e = heap.front();
heap.pop();
if ( used[e.node] )
continue;
if ( e.node == n )
break;
used[e.node] = true;
for ( int i = 0; i < graph.adj[e.node].size(); i++ )
{
Edge t = graph.adj[e.node].at( i );
if ( !used[t.node] )
{
if ( dist[e.node] + t.w < dist[t.node] )
dist[t.node] = dist[e.node] + t.w;
t.w = dist[t.node];
heap.push( t );
}
}
}
printf ( "%d\n", dist[n] );
}
int main()
{
read ();
dijtra ();
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator