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 |
kruskal Ac,然后写了优先队列优化的prim,WA十次,求指点#include<cstdio> #include<vector> #include<algorithm> #include<queue> #define MAXN 110 #define INF 0x3f3f3f3f using namespace std; struct Edge { int v,dist; Edge(int vv,int dd):v(vv),dist(dd){}; bool operator < (const Edge e) const { return dist>e.dist; } }; vector<Edge> edge[MAXN]; int Prim (int n) { Edge temp(0,0); int dist[MAXN]; int visited[MAXN]; priority_queue<Edge> q; int done=0; int sum=0; for(int i=0;i!=n;++i) { dist[i]=INF; visited[i]=0; } q.push(temp); while(done<n && !q.empty()) { do { temp=q.top(); q.pop(); }while(visited[temp.v]==1 && !q.empty()); if(visited[temp.v]==0) { sum+=temp.dist; visited[temp.v]=1; ++done; for(int i=0;i!=edge[temp.v].size();++i) { int k=edge[temp.v][i].v; if(visited[k]==0) { int w=edge[temp.v][i].dist; if(dist[temp.v]>w) { dist[temp.v]=w; q.push(Edge(k,w)); } } } } } if(done<n) return -1; return sum; } int main() { int n,w; while(scanf("%d",&n)!=EOF &&n) { for(int i=0;i!=n;++i) edge[i].clear(); for(int i=0;i!=n;++i) for(int j=0;j!=n;++j) { scanf("%d",&w); edge[i].push_back(Edge(j,w)); } printf("%d\n",Prim(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