【HDU6026】Deleting Edges
2024-08-26 05:25:16
题意
有一个n个节点的无向图,结点编号从0-n-1,每条边的长度时1to9的一个正整数。现在要删除一些边(或者不删),使得到的新图满足下面两个要求。
1.
新图是一颗树有n-1条边
2.
对于每个结点v(0ton-1)从0到v的距离要等于原图上从0到v的最短路
现在计算有多少种不同的图满足上面两个条件
分析
统计每个点可以到达最短路的入度值,然后相乘。这个题因为spfa写错了调了老久···
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue> using namespace std;
const int INF=;
const int maxn=;
const int MOD=;
int n;
char g[maxn][maxn];
int G[maxn][maxn];
int d[maxn],vis[maxn];
long long in[maxn];
long long ans;
void spfa(){
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)d[i]=INF;
queue<int>q;
q.push();vis[]=;
d[]=;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=;
for(int i=;i<n;i++){
if(G[u][i]){
if(d[i]>=d[u]+G[u][i]){
d[i]=d[u]+G[u][i];
if(!vis[i]){
vis[i]=;
q.push(i);
}
}
}
}
}
return;
}
int main(){
while(scanf("%d",&n)!=EOF){
memset(G,,sizeof(G));
for(int i=;i<n;i++){
for(int j=;j<n;j++){
scanf(" %c",&g[i][j]);
}
}
for(int i=;i<n;i++){
for(int j=;j<n;j++){
G[i][j]=g[i][j]-'';
}
}
spfa();
memset(in,,sizeof(in));
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(i!=j){
if(G[i][j]&&d[j]==d[i]+G[i][j]){
in[j]++;
}
}
}
}
ans=;
for(int i=;i<n;i++){
if(in[i])
ans=(ans%MOD*in[i]%MOD)%MOD;
}
printf("%lld\n",ans);
}
return ;
}
最新文章
- PHP+MySQL+Easyui tree菜单从后台加载json数据(一)
- C#小程序呢飞行棋设计分析
- Socurce Insight 快捷键
- Web Notification
- Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法
- Objective-C中关于请求返回NSData数据解析成NSDictionary或NSArray的方法
- JS跨域代码
- BZOJ 1033: [ZJOI2008]杀蚂蚁antbuster(模拟)
- 如何用JavaScript复制到剪贴板
- HDU1423 LCIS
- <;自动化测试方案_1>;第一章、为什么要做自动化测试?(Why)
- TensorFlow相关
- 线程同步-使用SimaphoreSlim类
- Centos6.5部署Sonar6.7.1备注
- k8s学习笔记之八:存储卷
- python 网络编程 缓冲和粘包
- vue2.0 axios交互
- httppost core net
- 【游记】CCHO TY国初划水记
- 批量得到/修改word超链接