prim模板(hdu1102为例)

来源:互联网 发布:优斗士网络推广效果 编辑:程序博客网 时间:2024/05/01 00:17
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>#define N 105#define inf 999999999using namespace std;  int n,m;    // n代表点的数量,m代表已修建的路的条数int map[N][N];  int dis[N];  int visit[N];    int prim(){      for(int i=1;i<=n;i++)  //先把每个点到已经建好的图中的路径置为无穷大   dis[i]=inf;      dis[1]=0;              //起点为顶点1       for(int j=1;j<=n;j++){          int t=inf,pos;  //临时变量:最短路径距离t,和该顶点pos           for(int i=1;i<=n;i++){     //查找最短路径'点'                 if(!visit[i]&&t>dis[i]){                  t=dis[i];                  pos=i;              }          }          visit[pos]=1;         //最短路径点标记为已经访问           for(int i=1;i<=n;i++){  //更新最短路径点                 //如果,顶点i未被访问过              //且图中新加入的pos点到i点的距离短于原来图到i点的距离              //且pos到i的点有连通(即不为无穷大),则将i点到图的距离更新.               if(!visit[i]&&dis[i]>map[pos][i]&&map[pos][i]!=inf){                  dis[i]=map[pos][i];              }          }      }         int temp=0;      for(int k=1;k<=n;k++){          temp+=dis[k];      }      return temp;  }      int main(){      int a,b;    while(scanf("%d",&n)!=EOF){          memset(map,0x3f,sizeof(map));        memset(visit,0,sizeof(visit));          for(int i=1;i<=n;i++){        //构建图的矩阵               for(int j=1;j<=n;j++){                  scanf("%d",&map[i][j]);              }          }          scanf("%d",&m);          for(int i=1;i<=m;i++){       //输入已经修建好的路                scanf("%d%d",&a,&b);            map[a][b]=0;              map[b][a]=0;          }          int ans=prim();          printf("%d\n",ans);      }      return 0;  }  



输入

3
0 990 692
990 0 179
692 179 0
1
1 2

输出

179


来自:http://blog.csdn.net/i_fuqiang/article/details/8244776