HDU 1863 通畅工程

来源:互联网 发布:淘宝怎么下载数据包 编辑:程序博客网 时间:2024/06/10 08:33

思路清晰的迪杰斯特拉算法,求最小生成树,解决带权值的并查集问题。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int Map[102][102],vis[102],d[102];int main(){    int a,b,v,n,m,i,j;    while(~scanf("%d%d",&n,&m)&&n)    {        memset(Map,0,sizeof(Map));        int N=n;        while(n--)        {            scanf("%d%d%d",&a,&b,&v);            Map[a][b]=v;        }        memset(vis,0,sizeof(vis));        int J,l=1;//集合初始大小为1        d[0]=1;//需要寻找的集合,从1开始找        vis[1]=1;//1为遍历过的点        int sum=0;        while(l<m)//当没有遍历所有点时,找点        {            int minl=99999999;            for(i=0; i<l; i++)            {                for(j=1; j<=m; j++)                {                    if(!vis[j]&&Map[d[i]][j]&&Map[d[i]][j]<minl)//寻找集合中的点和未寻找的有连线就判断是否更小                    {                        minl=Map[d[i]][j];                        J=j;                    }                }            }            if(minl==99999999)            break;            sum+=minl;            vis[J]=1;            d[l]=J,l++;//最小路径的尾结点设置为已经遍历的点,扩大点集合的规模。        }        if(l==m)        printf("%d\n",sum);        else        printf("?\n");    }    return 0;}


1 0
原创粉丝点击