首页 > 代码库 > HDU 6026 Deleting Edges
HDU 6026 Deleting Edges
最短路。
先建一个只包含最短路的有向无环图,每一个点选择任意一条入边即可生成一个树形图,那么树的种类就等于每个点的入度乘积。
#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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。