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 |
Re:这题不科学啊,同样的数据,两个ac掉的代码跑出来的不一样啊In Reply To:这题不科学啊,同样的数据,两个ac掉的代码跑出来的不一样啊 Posted by:201293123 at 2013-04-10 23:38:33 > 5 6 > 1 2 100 > 2 3 100 > 3 4 100 > 4 5 100 > 3 5 200 > 2 5 700 > > #include <stdio.h> > #define QR 65536 > #define MAX 0x7FFFFFFF > /* POJ 3255: Roadblocks */ > typedef struct str_vec > { > int to; > int length; > struct str_vec *next; > } vector; > vector chain[5100]; > int side_a[100100], side_b[100100], side_l[100100]; > int dist_0[5100]; > int dist_n[5100]; > int queue[QR], add, now, n; > void spfa (int source, int *dist) > { > vector *p; > int cur, tar, l, i; > > add = now = 0; > queue[add++] = source; > for (i = 0; i < n; i++) > dist[i] = MAX; > dist[source] = 0; > while (now != add) > { > cur = queue[(now++) % QR]; > p = (chain + cur)->next; > while (p != NULL) > { > tar = p->to; > l = p->length; > if (dist[cur] + l < dist[tar]) > { > dist[tar] = dist[cur] + l; > queue[(add++) % QR] = tar; > } > p = p->next; > } > } > return; > } > int main () > { > int m, i, st, ed, len, ans = MAX, sp, sn; > vector *p, *r; > > scanf("%d %d", &n, &m); > > for (i = 0; i < n; i++) > chain[i].to = i, chain[i].next = NULL; > > for (i = 0; i < m; i++) > { > scanf("%d %d %d", &st, &ed, &len); > st--, ed--; > side_a[i] = st, side_b[i] = ed, side_l[i] = len; > > r = chain + st; > while (r->next != NULL) r = r->next; > p = (vector *)malloc(sizeof(vector)); > p->to = ed, p->length = len, p->next = NULL; > r->next = p; > > r = chain + ed; > while (r->next != NULL) r = r->next; > p = (vector *)malloc(sizeof(vector)); > p->to = st, p->length = len, p->next = NULL; > r->next = p; > } > > spfa(0, dist_0); > spfa(n - 1, dist_n); > sp = dist_0[n - 1]; > > for (i = 0; i < m; i++) > { > st = side_a[i], ed = side_b[i], len = side_l[i]; > sn = dist_0[st] + len + dist_n[ed]; > if (sn != sp && sn < ans) ans = sn; > sn = dist_0[ed] + len + dist_n[st]; > if (sn != sp && sn < ans) ans = sn; > } > > printf("%d\n", ans); > //system("pause"); > > return 0; > } > 这跑出来是600 > > > > #include<iostream> > #include<queue> > #define MAXN 200001 > #include<string.h> > #include<stdio.h> > using namespace std; > struct node > { > int h,g,p; > bool operator < (node a) const > { > return a.h+a.g<h+g; > } > }; > struct nodeOfLine > { > int x,y,w,next; > }line[MAXN]; > int n,r,link[5001],g[5001]; > priority_queue<node> myqueue; > void djikstra() > { > int i,j,k,t; > bool used[MAXN]; > memset(g,0x7F,sizeof(g)); > memset(used,false,sizeof(used)); > g[n]=0; > for (t=1;t<=n;t++) > { > j=0; > for (i=1;i<=n;i++) > if (!used[i] && (!j || g[i]<g[j])) j=i; > used[j]=true; > k=link[j]; > while (k) > { > if (g[line[k].y]>g[line[k].x]+line[k].w) > g[line[k].y]=g[line[k].x]+line[k].w; > k=line[k].next; > } > } > return; > } > int Astar() > { > node h,temp; > int times[5001],k; > while (!myqueue.empty()) myqueue.pop(); > memset(times,0,sizeof(times)); > h.p=1; h.h=h.g=0; > myqueue.push(h); > while (!myqueue.empty()) > { > h=myqueue.top(); > myqueue.pop(); > times[h.p]++; > if (times[h.p]>2) continue; > if (times[h.p]==2 && h.p==n) return h.h+h.g; > k=link[h.p]; > while (k) > { > temp.p=line[k].y; > temp.h=h.h+line[k].w; > temp.g=g[line[k].y]; > myqueue.push(temp); > k=line[k].next; > } > } > return -1; > } > int main() > { > scanf("%d%d",&n,&r); > memset(link,0,sizeof(link)); > for (int i=1;i<=r;i++) > { > scanf("%d%d%d",&line[i*2-1].x,&line[i*2-1].y,&line[i*2-1].w); > line[i*2-1].next=link[line[i*2-1].x]; link[line[i*2-1].x]=i*2-1; > line[i*2].x=line[i*2-1].y; line[i*2].y=line[i*2-1].x; line[i*2].w=line[i*2-1].w; > line[i*2].next=link[line[i*2].x]; link[line[i*2].x]=i*2; > } > r*=2; > djikstra(); > printf("%d\n",Astar()); > return 0; > } > > > > 这跑出来是400 > 不科学啊 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator