HDU 1102 Constructing Roads

传送门

3371的弱化版,怎么都能过。

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;

const int MAXN = 1e2 + 3;
const int INF = 1e9;
int dis[MAXN][MAXN];
int N, Q;
int d[MAXN];
bool vis[MAXN];
int ans = 0;

int prim(int s)
{
    d[s] = 0;
    for (int i = 0; i < N; i++)
    {
        int mind = INF, u = -1;
        for (int j = 1; j <= N; j++)
        {
            if (!vis[j] && d[j] < mind)
            {
                mind = d[j];
                u = j;
            }
        }
        ans += mind;
        vis[u] = true;
        for (int j = 1; j <= N; j++)
        {
            if (!vis[j] && dis[u][j] != INF)
            {
                if (dis[u][j] < d[j])
                    d[j] = dis[u][j];
            }
        }
    }
    return ans;
}

int main()
{
    for (; ~scanf("%d", &N);) 
    {
        fill(dis[0], dis[0] + MAXN*MAXN, INF);
        fill(d + 1, d + N + 1, INF);
        fill(vis + 1, vis + N + 1, false);
        ans = 0;
        int dd;
        for (int i = 1; i <= N; i++)
        {
            for (int j = 1; j <= N; j++)
            {
                scanf("%d", &dd);
                if (i != j) dis[i][j] = dd;
            }
        }
        scanf("%d", &Q);
        int a, b;
        for (int i = 0; i < Q; i++)         // 神tm唬人的 n(n+1)/2
        {
            scanf("%d%d", &a, &b);
            dis[a][b] = dis[b][a] = 0;
        }
        printf("%d\n", prim(1));
    }

    return 0;
}
posted @ 2017-04-08 21:34  CrossingOver  阅读(97)  评论(0编辑  收藏  举报