HDU 1863 Unblocked Engineering

https://vjudge.net/problem/HDU-1863  question link

The classic problem at first glance is the minimum spanning tree, we can use prim and Kruskal two methods to solve


#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<queue>
#include<vector>
#include<stack>
#include<list>
#define INF 
using namespace std;
int a[110][110],dis[110];
int vis[110];
int n;
int prim()
{
    int sum,m;
    int i,j,k;
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++)
        dis[i]=a[1][i];
    vis[1]=1;
    sum=0;
    for(i=1;i<n;i++)
    {
        m=INF;
        for(j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]<m)
            {
                m=dis[j];
                k=j;
            }
        }
        if(m==INF)
            return 0;
        sum+=m;
        for(j=1;j<=n;j++)
            if(!vis[j]&&dis[j]>a[k][j])
                dis[j]=a[k][j];
        vis[k]=1;
    }
    return sum;
}

int main()
{
    int ans;
    int e,b,v;
    int m,i;
    while(scanf("%d%d",&m,&n),m)
    {
        memset(a,INF,sizeof(a));
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&e,&b,&v);
                a[e][b]=a[b][e]=v;
        }
        ans=prim();
        if(ans)
            printf("%d\n",ans);
        else
            puts("?");
    }
    return 0;
}

Here's a look at Kruskal


#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<queue>
#include<vector>
#include<stack>
#include<list>
using namespace std;
struct node
{
    int f,to,v;
    //node(int a,int b,int c):f(a) , to(b) ,v(c){};
    bool friend operator <(const node &x,const node &y)
    {
        return x.v<y.v;
    }
}s[105];
int pre[105];
int Find(int x)
{
    int r=x;
    int t;
    while(pre[x]!=x)
    x=pre[x];
    while(r!=x)
    {
        t=pre[r];
        pre[r]=x;
        r=t;
    }
    return r;
//return x==pre[x]?x:pre[x]=Find(pre[x]);void join(int x,int y){
    int fx=Find(x);
    int fy=Find(y);
    if(fx!=fy)
    pre[fx]=fy;
}
int main()
{
    //ios_base::sync_with_stdio(false);
    //cin.tie(0);
    //cout.tie(0);
    int n,m,i,j;
    while(scanf("%d",&n)&n!=0)
    {
        scanf("%d",&m);
            for(i=0;i<n;i++)
            scanf("%d %d %d",&s[i].f,&s[i].to,&s[i].v);
            sort(s,s+n);
            for(i=1;i<=m;i++)
                pre[i]=i;
                int sum=0;
                for(i=0;i<n;i++)
                {
                    if(Find(s[i].f)!=Find(s[i].to))
                    {
                        join(s[i].f,s[i].to);
                        sum+=s[i].v;
                    }
                }
            int N=0;
            for(i=1;i<=m;i++)
            {
                if(pre[i]==i)
                    N++;
                if(N>1) break;
            }
                 if(i!=m+1)
                    cout<<'?'<<endl;
                 else cout<<sum<<endl;
    }
}



Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326319054&siteId=291194637