HDOJ 1879

来源:互联网 发布:淘宝怎么举报卖家假货 编辑:程序博客网 时间:2024/06/06 10:55

思路:求最小生成树(最小生成树就是权值之和最小的极小连通子图) ,注意将已修过的边的权值置为0;

数据结构:由于数据量小,可以用临接矩阵直接存储图


#include<stdio.h>#include<string.h>int vis[101];int price[101];int map[101][101];void init(int n){    int i;    memset(vis,0,sizeof(vis));    for(i = 1;i <= n;i ++)        price[i] = map[1][i];}int main(){    int i,j,k,n;    int min,a,b,c,d,sum;    while(~scanf("%d",&n) && n)    {        sum = 0;        for(i = 0;i < (n*(n-1))/2;i ++)        {            scanf("%d%d%d%d",&a,&b,&c,&d);            map[b][a] = map[a][b] = c;            if(d)                map[b][a] = map[a][b] = 0;        }        init(n);        vis[1] = 1;        for(i = 0;i < n;i ++)        {            k = 0;            min = 1 << 30;            for(j = 1;j <= n;j ++)            {                if(!vis[j] && min > price[j])                {                    min = price[j];                    k = j;                }            }            if(min != 1 << 30)                sum += min;            vis[k] = 1;            for(j = 1;j <= n;j ++)            {                if(!vis[j] && price[j] > map[k][j])                    price[j] = map[k][j];            }        }        printf("%d\n",sum);    }    return 0;}



0 0
原创粉丝点击