码迷,mamicode.com
首页 > 其他好文 > 详细

CH6202 黑暗城堡

时间:2018-09-02 17:08:36      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:amp   ace   org   路径   距离   class   set   cstring   com   

一道最短路+生成树

原题链接

实际上就是生成树的中每个点到节点\(1\)的距离等于原图中这个点到节点\(1\)的最短距离,求这样的生成树的棵数。
先用\(SPFA\)\(Dijkstra\)求出所有点到节点\(1\)的最短路径\(dis[x]\),然后将所有节点按\(dis\)从小到大排序。
枚举\(x\),表示已经有\(x-1\)个点添入树,现在要添加第\(x\)个点。
统计有多少个点\(y\)满足\(y\)是已添入树的点,且\(dis[y]+edge(x,y)=dis[x]\)\(edge\)表示边长。
最后将每次将某个点添入树时的方案数累乘起来即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1010;
const int mod = 1LL * (1 << 31) - 1;
struct dd {
    int x, D;
};
dd dis[N];
int a[N][N];
bool v[N];
int re()
{
    int x = 0;
    char c = getchar();
    bool p = 0;
    for (; c<'0' || c>'9'; c = getchar())
        p |= c == '-';
    for (; c >= '0'&&c <= '9'; c = getchar())
        x = x * 10 + (c - '0');
    return p ? -x : x;
}
int comp(dd x, dd y)
{
    return x.D < y.D;
}
inline int minn(int x, int y)
{
    return x < y ? x : y;
}
int main()
{
    int i, j, n, m, x, y, s = 1, k;
    n = re();
    m = re();
    memset(a, 60, sizeof(a));
    memset(dis, 60, sizeof(dis));
    for (i = 1; i <= n; i++)
    {
        a[i][i] = 0;
        dis[i].x = i;
    }
    for (i = 1; i <= m; i++)
    {
        x = re();
        y = re();
        a[x][y] = a[y][x] = re();
    }
    dis[1].D = 0;
    for (i = 1; i <= n; i++)
    {
        x = 0;
        for (j = 1; j <= n; j++)
            if (!v[j] && (dis[j].D < dis[x].D || !x))
                x = j;
        if (!x)
            break;
        v[x] = 1;
        for (j = 1; j <= n; j++)
            dis[j].D = minn(dis[j].D, dis[x].D + a[x][j]);
    }
    sort(dis + 1, dis + n + 1, comp);
    for (i = 2; i <= n; i++)
    {
        k = 0;
        for (j = 1; j < i; j++)
            if (dis[j].D + a[dis[j].x][dis[i].x] == dis[i].D)
                k++;
        s = (1LL * s*k) % mod;
    }
    printf("%d", s);
    return 0;
}

ps:因为我用的是\(VS\),所以代码会自动补空格,而我本来的风格是没有空格的。

CH6202 黑暗城堡

标签:amp   ace   org   路径   距离   class   set   cstring   com   

原文地址:https://www.cnblogs.com/Iowa-Battleship/p/9574162.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!