| ||||||||||
| 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 | |||||||||
好大力气写完个,3k的代码,就是RE过不了!!谁能帮我看看 ?#include <iostream>
#include <fstream>
#include <cstdio>
const int N = 40000;
using namespace std;
struct edge
{
int id, len;
edge *next;
};
struct vertex
{
edge *first;
};
vertex ver[N];
int n, m, heap_size, dist[N], heap[3*N];
bool visited[N];
int left (int i)
{
return 2*i;
}
int right (int i)
{
return 2*i + 1;
}
int parent (int i)
{
return i/2;
}
void min_heapfy (int x)
{
int l, r, smallest = x;
int tmp;
l = left (x); r = right (x);
if (l <= heap_size && dist[heap[l]] < dist[heap[smallest]])
smallest = l;
if (r >= heap_size && dist[heap[r]] < dist[heap[smallest]])
smallest = r;
if (smallest != x)
{
tmp = heap[x];
heap[x] = heap[smallest];
heap[smallest] = tmp;
min_heapfy (smallest);
}
}
void build_heap ()
{
int i;
for (i = heap_size/2; i >= 1; i --)
{
min_heapfy (i);
}
}
int extract_min ()
{
int min;
min = dist[heap[1]];
heap[1] = heap[heap_size];
heap_size --;
min_heapfy (1);
return min;
}
int judge (int x, int y)
{
edge *p;
p = ver[x].first;
while (p && p->id != y)
{
p = p->next;
}
if (p)
{
return p->len;
}
return 0;
}
int Dijkstra (int s)
{
int i, j, v, w;
visited[s] = true;
for (i = 1; i < n; i ++)
{
v = heap[1];
visited[v] = true;
if (v == (n - 1))
{
return dist[v];
}
extract_min ();
for (j = 0; j < n; j ++)
{
if (!visited[j])
{
w = judge (v, j);
if (dist[v] + w < dist[j] && w != 0)
{
dist[j] = dist[v] + w;
}
}
}
build_heap ();
}
}
void solve ()
{
int i = 0;
heap_size = n - 1;
edge *p;
p = ver[0].first;
while (p)
{
dist[p->id] = p->len;
p = p->next;
}
dist[0] = 0;
printf ("%d\n", Dijkstra (0));
}
int main ()
{
int i, a, b, c;
edge *p;
scanf ("%d %d", &n, &m);
for (i = 0; i < n; i ++)
{
ver[i].first = NULL;
visited[i] = false;
heap[i] = i;
dist[i] = INT_MAX;
}
for (i = 0; i < m; i ++)
{
scanf ("%d %d %d", &a, &b, &c);
p = new edge;
p->id = b - 1;
p->len = c;
p->next = ver[a - 1].first;
ver[a - 1].first = p;
}
solve ();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator