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 0msSource Code //想知道怎样再这个基础上优化内存,离大牛们的水平还很远阿 Problem: 3268 User: dut200901102 Memory: 840K Time: 0MS Language: G++ Result: Accepted Source Code #include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <queue> //spfa + queue + 数组模拟邻接表 using namespace std; const int MAXN=1001; const int MAXM=100001; const int INF=2000000001; struct edge{ int to,weigh,next; }edges1[MAXM],edges2[MAXM]; int box1[MAXN],box2[MAXN]; int n,m,x; int d[MAXN]; void spfa(int start,edge edges[],int box[]) { int i,k,u; bool flag[MAXN]; queue < int > que; memset(flag,false,sizeof(flag)); for(i=1;i<=n;++i) { d[i]=INF; } d[start]=0; que.push(start); flag[start]=true; while(!que.empty()) { k=que.front(); que.pop(); flag[k]=false; for(i=box[k];i!=-1;i=edges[i].next) { u=edges[i].to; if(d[u]-edges[i].weigh>d[k]) { d[u]=d[k]+edges[i].weigh; if(!flag[u]) { que.push(u); flag[u]=true; } } } } } int main() { //freopen("in.txt","r",stdin); int i,a,b,v,max; int ans[MAXN]; while(scanf("%d%d%d",&n,&m,&x)!=EOF) { memset(box1,-1,sizeof(box1)); memset(box2,-1,sizeof(box2)); for(i=0;i<m;++i) { scanf("%d%d%d",&a,&b,&v); edges1[i].to=b; edges1[i].weigh=v; edges1[i].next=box1[a]; box1[a]=i; edges2[i].to=a; edges2[i].weigh=v; edges2[i].next=box2[b]; box2[b]=i; } spfa(x,edges1,box1); for(i=1;i<=n;++i) { ans[i]=d[i]; } spfa(x,edges2,box2); for(i=1;i<=n;++i) { ans[i]+=d[i]; } max=1; for(i=1;i<=n;++i) { if(ans[i]>ans[max]) { max=i; } } printf("%d\n",ans[max]); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator