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 |
路过的好心人,帮忙看看哪里错了//写的比较麻烦,是想用用刚学的priority_queue和数组存边 #include<iostream> #include<mem.h> #include<queue> #include<vector> #include<algorithm> #include<iomanip> #define big 999999999.9 using namespace std; struct node //边性质 { int from,to; double w; }; node edg[250005]; //记录边 double in[130005]; //记录边内点的推倒时间 bool operator < (node a,node b) { if(a.from==b.from) return a.to<b.to; return a.from<b.from; } struct cmp { bool operator () (node a,node b) { return a.w>b.w; } }; int index[505]; //第i个点推导后,会直接推倒edg[j].to(j:index[i]-index[i+1]) double key[505]; //点被推倒的时间 bool flag[505]; int main() { int n,edge,test=0; priority_queue <node,vector<node>,cmp> q; while(cin>>n>>edge,n) { test++; cout<<"System #"<<test<<endl; if(n==1 && edge==0) { cout<<"The last domino falls after " <<setiosflags(ios::fixed)<<setprecision(1) <<0.00<<" seconds, at key domino 1."<<endl; continue; } memset(flag,0,sizeof(flag)); for(int i=0;i<=n;i++) key[i]=big; for(int i=0;i<edge;i++) { cin>>edg[i].from>>edg[i].to>>edg[i].w; edg[i+edge].from=edg[i].to; edg[i+edge].to=edg[i].from; edg[i+edge].w=edg[i].w; } //将无向图变成有向图 sort(edg,edg+2*edge); index[edg[2*edge-1].from+1]=2*edge; for(int i=2*edge-1;i>=0;i--) index[edg[i].from]=i; //建立索引 //dijkstra: int now=1; key[now]=0; while(1) { flag[now]=true; for(int i=index[now];i<index[now+1];i++) { if(key[edg[i].to]>key[now]+edg[i].w) { key[edg[i].to]=key[now]+edg[i].w; q.push( (node){ edg[i].from , edg[i].to , edg[i].w} ); } } node temp; while(!q.empty()) { temp=q.top(); q.pop(); if(flag[temp.to]!=true && flag[temp.from]!=false) break; } if(flag[temp.to]!=true) now=temp.to; else break; } //求出点的推倒时间 //求边内点的推到时间 for(int i=0;i<2*edge;i++) { double la,sm; if(key[edg[i].from]>key[edg[i].to]) { la=key[edg[i].from]; sm=key[edg[i].to]; } else { sm=key[edg[i].from]; la=key[edg[i].to]; } if(sm+edg[i].w<=la) in[i]=sm; else in[i]=la+(edg[i].w+sm-la)/2; } //找到最后倒的点 int posv,posi; double maxv=-big,maxi=-big; for(int i=1;i<=n;i++) if(key[i]>maxv) { maxv=key[i]; posv=i; } for(int i=0;i<2*edge;i++) if(in[i]>maxi) { maxi=in[i]; posi=i; } if(key[posv]>=in[posi]) cout<<"The last domino falls after " <<setiosflags(ios::fixed)<<setprecision(1) <<key[posv]<<" seconds, at key domino "<<posv<<"."<<endl; else { int a=edg[posi].from,b=edg[posi].to; if(a<b) { int temp=a; a=b; b=temp; } cout<<"The last domino falls after " <<setiosflags(ios::fixed)<<setprecision(1)<<in[posi] <<" seconds, between key dominoes "<<b <<" and "<<a<<"."<<endl; } cout<<endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator