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

HDU 6026 Deleting Edges

时间:2017-05-07 20:01:52      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:std   queue   nbsp   name   pre   amp   const   while   memset   

最短路。

先建一个只包含最短路的有向无环图,每一个点选择任意一条入边即可生成一个树形图,那么树的种类就等于每个点的入度乘积。

#include <bits/stdc++.h>
using namespace std;

const long long mod = 1e9+7;
int n;
char s[60][60];
int dis[60],f[60];
int in[60];

void spfa()
{
    queue<int>Q;
    for(int i=0;i<n;i++) f[i]=0,dis[i] = 0x7FFFFFFF;
    dis[0]=0; Q.push(0); f[0]=1;

    while(!Q.empty())
    {
        int h = Q.front(); Q.pop(); f[h]=0;
        for(int i=0;i<n;i++)
        {
            int val = s[h][i]-0;
            int to = i;
            if(val==0) continue;
            if(dis[h]+val<dis[to])
            {
                dis[to] = dis[h]+val;
                if(f[to]==0)
                {
                    f[to]=1;
                    Q.push(to);
                }
            }
        }
    }
}

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++) scanf("%s",s[i]);
        spfa();

        memset(in,0,sizeof in);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i==j) continue;
                int val = s[i][j]-0;
                if(val==0) continue;
                if(dis[i]+val == dis[j])
                {
                    in[j]++;
                }
            }
        }

        long long ans=1;

        for(int i=0;i<n;i++)
        {
            if(in[i]==0) continue;
            ans = ans* (long long)in[i]%mod;
        }

        printf("%lld\n",ans);

    }
    return 0;
}

 

HDU 6026 Deleting Edges

标签:std   queue   nbsp   name   pre   amp   const   while   memset   

原文地址:http://www.cnblogs.com/zufezzt/p/6821669.html

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