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 |
请教:Prim+堆 样例没问题,但是提交WrongAnwer,能给几组测试数据也行,24小时等回帖#include <iostream> #include <vector> #include <algorithm> #include <queue> #include <cmath> #define INF 9999999 using namespace std; int S,N; struct Point{ int x,y; }; Point P[505]; double dis[505]; struct XEdge{ int v; double w; XEdge(int v_=0,double w_=INF):v(v_),w(w_){} }; inline double dista( Point p1, Point p2){ return sqrt((double)(p1.x-p2.x)*(p1.x-p2.x)+(double)(p1.y-p2.y)*(p1.y-p2.y)); } vector<vector<XEdge> > G(30); double HeapPrim(const vector<vector<XEdge> > &G,int n) { int i,j,k; XEdge xDist(0,0); priority_queue<XEdge> pq; vector<double> vDist(n); vector<int> vUsed(n); int nDoneNum = 0; for(i=0;i<n;i++){ vUsed[i] = 0; vDist[i] = INF; } nDoneNum = 0; double nTotal = 0; pq.push(XEdge(0,0)); while(nDoneNum<n&&!pq.empty()){ do{ xDist = pq.top(); pq.pop(); }while(vUsed[xDist.v]==1&&!pq.empty()); if(vUsed[xDist.v]==0){ nTotal+=xDist.w; dis[nDoneNum++] = xDist.w; vUsed[xDist.v] = 1; for(i =0;i<G[xDist.v].size();i++){ int k= G[xDist.v][i].v; if(vUsed[k] == 0){ double w = G[xDist.v][i].w; if(vDist[k]>w){ vDist[k] = w; pq.push(XEdge(k,w)); } } } } } if(nDoneNum<n) return -1; return nTotal; } bool operator <(const XEdge &e1,const XEdge &e2) { return e1.w>e2.w; } int main() { int i,j,t; scanf("%d",&t); while(t--){ scanf("%d %d",&S,&N); for(i=0;i<N;i++){ scanf("%d %d",&P[i].x,&P[i].y); for(j=0;j<i;j++){ double d = dista(P[i],P[j]); XEdge xDist(0,0); xDist.v=i, xDist.w=d; G[j].push_back(xDist); xDist.v=j; xDist.w=d; G[i].push_back(xDist); } } HeapPrim(G,N); sort(dis+1,dis+N); printf("%0.2f\n",dis[N-S]); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator