程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1102 Constructing Roads

HDU 1102 Constructing Roads

編輯:C++入門知識

HDU 1102 Constructing Roads


這題很顯然用最小生成樹來做。不過要稍微變化一下,一開始我打算用一個布爾數組來標記哪些村莊之間已經用道路連接,可是我發現寫起來有點費勁,於是突然想到如果把已經修建的道路想象成0是不是就可以呢,仔細想了一下,貌似真的可以,提交之後果然過了。

#include
#include
#include
#include
#include
#include
using namespace std;
const int N=102;
const int inf=1<<28;
int vill[N][N],mincost[N];
bool used[N];
int n,q;
void solve()
{
    fill(mincost,mincost+N,inf);
    memset(used,false,sizeof(used));
    mincost[1]=0;
    int cost=0;
    while(true)
    {
        int _min=inf,u=-1;
        for(int i=1;i<=n;i++)
            if(!used[i]&&_min>mincost[i])
                _min=mincost[i],u=i;
        if(u==-1)
            break;
        used[u]=true;
        cost+=_min;
        for(int i=1;i<=n;i++)
            mincost[i]=min(mincost[i],vill[u][i]);
    }
    printf("%d\n",cost);
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            scanf("%d",&vill[i][j]);
        scanf("%d",&q);
        int a,b;
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d",&a,&b);
            vill[a][b]=vill[b][a]=0;
        }
        solve();
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved