POJ-1789 Truck History(prim算法,最小生成树)

来源:互联网 发布:java中switch是什么 编辑:程序博客网 时间:2024/05/18 02:18

最小生成树模板题。一开始把字符数组定义成了整型数组又用了scanf..wa了好几次才发现。
prim算法和最短路里的Dijstra算法非常相似,只是在对点的距离定义上有所区别..理解起来很方便.
题目比较简单,直接贴代码了

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int INF=0x3f3f3f3f;const int MAXN=3000;int dis[MAXN];char str[MAXN][8];int MAP[MAXN][MAXN];//int pre[MAXN];bool vis[MAXN];int n;int prime(){    for(int i = 2;i <= n;i++)    dis[i] = INF ;    dis[1] = 0 ;    memset(vis , 0 ,sizeof(vis)) ;    int ans = 0 ;    while(1)    {        int mi = INF ;int pos ;        for(int i = 1;i <= n;i++)        if(!vis[i] && dis[i] < mi)        mi = dis[pos = i] ;        if(mi == INF)break;        vis[pos] = 1;        ans += mi ;        for(int j = 1;j <= n ;j++)        dis[j] = min(dis[j] , MAP[pos][j]) ;    }    return ans ;}    int main()    {     //int n;        while(scanf("%d" , &n) && n)        {               for(int i = 1;i <= n;i++)            {                scanf("%s" , &str[i][1]) ;                for(int j = 1;j <= i;j++)                {                    int sum = 0 ;                    for(int k = 1;k <= 7 ;k++)                    if(str[i][k] != str[j][k])                    sum++ ;                    MAP[i][j] = MAP[j][i] = sum ;                }            }            int ans = prime() ;            printf("The highest possible quality is 1/%d.\n" , ans) ;        }        return 0 ;    }
阅读全文
0 0