poj1251(prim)

来源:互联网 发布:北京java学费 编辑:程序博客网 时间:2024/06/16 01:19

prim 模板

int prim(){    int s = 1;    int m = 1;    bool visit[30];    int min,flag;    memset(visit,false,sizeof(visit));    int dist[30];    for(int i=1;i<=n;i++)      dist[i] = inf;    int prim_weight = 0;    while(1)    {        if(m == n)         break;         min = inf;         for(int j=2;j<=n;j++)           {               if(!visit[j]&&dist[j]>map[s][j])                 dist[j] = map[s][j];               if(!visit[j]&&min>dist[j])               {                   min = dist[j];                   flag = j;               }           }           s = flag;           visit[s] = true;           prim_weight += min;           m++;    }    return prim_weight;}


poj 1251:

  这道题一看到图就知道是最小生成树。。。。。模板题
源码:

#include <iostream>#include <memory.h>using namespace std;int map[30][30];int n;const int inf = 1000000;int prim(){    int s = 1;    int m = 1;    bool visit[30];    int min,flag;    memset(visit,false,sizeof(visit));    int dist[30];    for(int i=1;i<=n;i++)      dist[i] = inf;    int prim_weight = 0;    while(1)    {        if(m == n)         break;         min = inf;         for(int j=2;j<=n;j++)           {               if(!visit[j]&&dist[j]>map[s][j])                 dist[j] = map[s][j];               if(!visit[j]&&min>dist[j])               {                   min = dist[j];                   flag = j;               }           }           s = flag;           visit[s] = true;           prim_weight += min;           m++;    }    return prim_weight;}int main(){    char temp;    int t;    char u;    int cost;    while(cin>>n)    {      if(!n)        break;      for(int i=1;i<n;i++)        for(int j=1;j<=n;j++)        map[i][j] = map[j][i] = inf;      for(int i=1;i<n;i++)      {          cin>>temp>>t;          for(int j=1;j<=t;j++)          {              cin>>u>>cost;              map[u-'A'+1][temp-'A'+1] = cost;              map[temp-'A'+1][u-'A'+1] = cost;          }      }      cout<<prim()<<endl;    }    return 0;}


  

原创粉丝点击