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 |
用spfa加队列的怎么就wa了呢,哪位好心的大牛知道的麻烦给发个邮件#include <iostream> #include <cmath> #include <algorithm> using namespace std; const int MAXN = 30010; const int MAXM = 155000; const int INF = 0x7fffffff; struct Edge { int to; int val; Edge *next; }e[MAXM], *hd[MAXN]; int m,n; int idx; int a[MAXN]; int b[MAXN]; int c[MAXN]; int q[MAXN]; void addEdge(int from,int to,int val) { e[idx].to=to; e[idx].val=val; e[idx].next=hd[from]; hd[from]=&e[idx++]; } void makeGraph() { memset(hd,0,sizeof(hd)); idx=0; int i; for(i=1;i<=m;i++) addEdge(a[i],b[i],c[i]); } int d[MAXN]; int used[MAXN]; char mark[MAXN]; bool spfa() { int head,tail,i,pos; Edge *p; head=tail=0; for(i=1;i<=n;i++) { mark[i]=0; used[i]=0; d[i]=INF; } d[1]=0; mark[1]=1; q[tail++]=1; while(head!=tail) { pos=q[head++]; if(head==MAXN) head=0; mark[pos]=0; for(p=hd[pos];p!=0;p=p->next) if(d[p->to]>d[pos]+p->val) { d[p->to]=d[pos]+p->val; if(mark[p->to]==0) { mark[p->to]=1; q[tail++]=p->to; if(tail==MAXN) tail=0; used[p->to]++; if(used[p->to]==n) return false; } } } return true; } int main() { int i; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]); makeGraph(); spfa(); printf("%d\n",d[n]); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator