码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1258

时间:2015-10-28 12:21:56      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

POJ 1258

标签:

原文地址:http://www.cnblogs.com/xlsryj/p/4916565.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!