• hdu 6026 Deleting Edges(最短路计数)


    题目链接:hdu 6026 Deleting Edges

    题意:

    给你n个点,和一个邻接矩阵,非0表示有边,0表示没边。

    现在让你删一些边,构成一棵树,使得每个点到0这个点的距离为没删边之前的最短路。

    问有多少棵这样的树。

    题解:

    首先,题意说从0点开始对每个点都最短路,那么用单源最短路就能搞定。

    如何来计数呢?

    对于每一个点,我们记录能到底这点的最短路的条数,那么能够成题目要求的那种树的数量就是

    ans=cnt[1]*cnt[2]*...*cnt[n-1]。

     1 #include<cstdio>
     2 #define F(i,a,b) for(int i=a;i<=b;i++)
     3 using namespace std;
     4 typedef long long ll;
     5 
     6 const int N=55,inf=1e9+7;
     7 int n,cnt[N],inq[N],dis[N],Q[1000];
     8 char mp[N][N];
     9 
    10 void spfa()
    11 {
    12     F(i,1,n)dis[i]=inf,inq[i]=0,cnt[i]=0;
    13     int head=0,tail=0;
    14     inq[0]=1,Q[0]=0;
    15     while(head!=tail+1)
    16     {
    17         int x=Q[head++];
    18         inq[x]=0;
    19         F(v,1,n-1)if(mp[x][v]!='0')
    20         {
    21             if(dis[v]>dis[x]+mp[x][v]-'0')
    22             {
    23                 cnt[v]=1;
    24                 dis[v]=dis[x]+mp[x][v]-'0';
    25                 if(inq[v]==0)Q[++tail]=v,inq[v]=1;
    26             }else if(dis[v]==dis[x]+mp[x][v]-'0')cnt[v]++;
    27         }
    28     }
    29 }
    30 
    31 int main()
    32 {
    33     while(~scanf("%d",&n))
    34     {
    35         F(i,0,n-1)scanf("%s",mp[i]);
    36         spfa();
    37         ll ans=1;
    38         F(i,1,n-1)ans=ans*cnt[i]%inf;
    39         printf("%lld
    ",ans);
    40     }
    41     return 0;
    42 }
    View Code
  • 相关阅读:
    python3.4 + pycharm 环境安装 + pycharm使用
    ddt源码修改:HtmlTestRunner报告依据接口名显示用例名字
    re模块
    LeetCode Weekly Contest 12
    求解强连通分量
    几道题-找规律-记录并查找
    欧几里德算法
    树上二分
    几道题-博弈
    随便写一些东西-缩边
  • 原文地址:https://www.cnblogs.com/bin-gege/p/6873717.html
Copyright © 2020-2023  润新知