hdu 1102 Constructing Roads

http://acm.hdu.edu.cn/showproblem.php?pid=1102  如果两个城市之间有边,则把其置为0,然后直接最小生成树,记录总距离。

View Code
 1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4 const int N=108;
5 int mat[N][N];
6 int dis[N];
7 bool visited[N];
8 int n;
9 int find()//在dis中找没访问的值最小的
10 {
11 int pos=-1,minx=99999;
12 for(int i=1;i<=n;i++)
13 if(dis[i]<minx && !visited[i]) minx=dis[i],pos=i;
14 return pos;
15 }
16 void prim()//最小生成树
17 {
18 memset(visited,false,sizeof(visited));
19 int i,j,sum,pos;
20 for(i=1;i<=n;i++) dis[i]=mat[1][i];//从1,开始prim算法
21 visited[1]=true;
22 sum=0;
23 for(i=0;i<n-1;i++)//找n-1次
24 {
25 pos=find();//cout<<"pos:"<<pos<<endl;
26 visited[pos]=true;
27 sum+=dis[pos];//cout<<"sum:"<<sum<<endl;
28 for(j=1;j<=n;j++)
29 if(!visited[j] && dis[j]>mat[pos][j]) dis[j]=mat[pos][j];///注意
30 }
31 cout<<sum<<endl;
32 }
33 int main()
34 {
35 while(cin>>n)
36 {
37 int i,j;
38 for(i=1;i<=n;i++)
39 for(j=1;j<=n;j++) cin>>mat[i][j];//输入矩阵
40 int m,x,y;
41 cin>>m;
42 for(i=0;i<m;i++)
43 {
44 cin>>x>>y;
45 mat[x][y]=mat[y][x]=0;//有路,把距离置为0,
46 }
47 prim();
48 }
49 return 0;
50 }


 

posted @ 2012-04-03 16:18  keepmoving89  阅读(118)  评论(0编辑  收藏  举报