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 |
cong~~~In Reply To:经过4次RE,5次TLE,15次WA,两天的努力,终于把这个题目给AC了,忍不住发贴庆祝 !!!! Posted by:417370112 at 2007-02-10 14:03:33 > #include <iostream> > #include <fstream> > #include <cstdio> > const int N = 31000; > > using namespace std; > > struct edge > { > int id, len; > edge *next; > }; > struct vertex > { > edge *first; > }; > > vertex ver[N]; > int n, m, heap_size, dist[N], index[N], heap[2*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 swap (int &a, int &b) > { > int t; > t = a; > a = b; > b = t; > } > void min_heapfy (int x) > { > int l, r, smallest = x; > if (x >= 1 && x <= heap_size) > { > 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) > { > swap (index[heap[x]], index[heap[smallest]]); > swap (heap[x], heap[smallest]); > 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]; > index[heap[heap_size]] = 1; > heap_size --; > min_heapfy (1); > return min; > } > bool empty () > { > return heap_size > 0 ? false : true; > } > void increase (int i) > { > int j; > j = i / 2; > while (i >= 1 && j > 0 && dist[heap[i]] < dist[heap[j]]) > { > swap (index[heap[i]], index[heap[j]]); > swap (heap[i], heap[j]); > i = j; > j = i / 2; > } > } > int Dijkstra (int s) > { > int t, tmp1, tmp2, j, v, w; > edge *p; > visited[s] = true; > while (!empty()) > { > v = heap[1]; > visited[v] = true; > if (v == (n - 1)) > { > return dist[v]; > } > extract_min (); > p = ver[v].first; > while (p) > { > if (!visited[p->id]) > { > j = p->id; > w = p->len; > if (dist[v] + w < dist[j]) > { > dist[j] = dist[v] + w; > increase (index[j]); > } > } > p = p->next; > } > } > } > 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; > build_heap (); > 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; > index[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