标签:
POJ 1258
题目大意:修光缆,有N个村庄,输入一组N*N的矩阵,第i行写第i个村庄分别到其它村庄的距离。求他们的最短距离
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #include<queue> 6 #include<functional> 7 using namespace std; 8 #define MAX_V 6565 9 10 struct edge 11 { 12 int to,cost; 13 edge(int to=0,int cost=0):to(to),cost(cost) 14 { 15 } 16 }; 17 typedef pair<int ,int >P; 18 vector<edge>G[MAX_V]; 19 int mincost[MAX_V]; 20 bool used[MAX_V]; 21 int V; 22 23 int prim() 24 { 25 int res=0; 26 priority_queue<P,vector<P>,greater<P> >que; 27 memset(used,0,V*sizeof(bool)); 28 //根据题目,有时测试数据很大时必须将其初始化足够大 29 memset(mincost,0x3f3f3f,sizeof(int)*V); 30 mincost[0]=0; 31 que.push(P(0,0)); 32 while(!que.empty()) 33 { 34 P p=que.top(); 35 que.pop(); 36 int v=p.second; 37 if(mincost[v]<p.first || used[v]) 38 { 39 continue; 40 } 41 used[v]=true; 42 res+=mincost[v]; 43 for(int i=0;i<G[v].size();i++) 44 { 45 edge e=G[v][i]; 46 if(mincost[e.to]>e.cost) 47 { 48 mincost[e.to]=e.cost; 49 que.push(P(mincost[e.to],e.to)); 50 } 51 } 52 } 53 return res; 54 } 55 56 57 int main() 58 { 59 //注意这个输入 60 while(cin>>V&&V) 61 { 62 for(int i=0;i<V;i++) 63 { 64 G[i].clear(); 65 for(int j=0;j<V;j++) 66 { 67 int cost; 68 cin>>cost; 69 G[i].push_back(edge(j,cost)); 70 } 71 } 72 cout<<prim()<<endl; 73 } 74 return 0; 75 }
标签:
原文地址:http://www.cnblogs.com/xlsryj/p/4916565.html