题目:告诉你每两个点之间的最短路距离。构造每条边边权<=m的无向完全图。求有多少种不同边权的图满足最短路限制?n<=400.

标程:

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=;
const int N=;
int n,a[N][N],c[N][N],g[N],f[N],sz[N],h[N],ans,m;
bool ok()
{
for (int i=;i<=n;i++) if (a[i][i]) return ;
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++) if (a[i][j]!=a[j][i]||a[i][j]>m) return ;
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
for (int k=;k<=n;k++)
if ((ll)a[i][k]+a[k][j]<a[i][j]) return ;
return ;
}
int find(int x) {return x==f[x]?x:f[x]=find(f[x]);}
int ksm(int x,int y)
{
int res=;
while (y) {if (y&) res=(ll)res*x%mod; x=(ll)x*x%mod; y>>=;}
return res;
}
void init()
{
for (int i=;i<=n;i++) c[i][]=;
for (int i=;i<=n;i++)
for (int j=;j<=i;j++) c[i][j]=((ll)c[i-][j]+c[i-][j-])%mod;
}
int main()
{
scanf("%d%d",&n,&m);init(); ans=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) scanf("%d",&a[i][j]);
if (!ok()) return puts(""),;
for (int i=;i<=n;i++) f[i]=i;
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++) if (!a[i][j]) f[find(i)]=find(j);
for (int i=;i<=n;i++) sz[find(i)]++;
for (int i=;i<=n;i++)
if (f[i]==i)
for (int j=i+,k;j<=n;j++)
if (f[j]==j)
{
for (k=;k<=n;k++)
if (f[k]==k&&k!=i&&k!=j&&a[i][j]==(ll)a[i][k]+a[k][j]) break;
int ts=sz[i]*sz[j];
if (k<=n) ans=(ll)ans*ksm(m-a[i][j]+,ts)%mod;
else ans=(ll)ans*(ksm(m-a[i][j]+,ts)-ksm(m-a[i][j],ts)+mod)%mod;
}
for (int i=;i<=n;i++)
{
g[i]=h[i]=ksm(m+,i*(i-)/);//h[i]表示i个点不保证mst=0的方案数。g[i]表示包含1点和其他i-1个点中保证有mst=0的方案数。
for (int j=;j<i;j++)
g[i]=(ll)(g[i]-(ll)g[j]*h[i-j]%mod*c[i-][j-]%mod*ksm(m,j*(i-j))%mod+mod)%mod;
}
for (int i=;i<=n;i++) if (f[i]==i) ans=(ll)ans*g[sz[i]]%mod;
printf("%d\n",ans);
return ;
}

易错点:1.不要漏取模。

题目:性质+并查集+容斥dp

特判一下不合法(无解)的情况。

考虑一张没有0边的图(如果有0边的话ijk三角形中会有两条边被判作无用),当a[i,j]=a[i,k]+a[k,j]时,a[i,j]这条边可以在a[i,j]~m中任取,这条边是没有贡献的。

考虑特殊的0边,如果有一些点对的距离为0,那么就用并查集缩起来,那么这个图就变成了若干个连通块,每个连通块中的点对之间的距离都是0。

所以就可以在连通块之间做没有0边的情况(两个连通块之间的所有边应该都是相等的,一条边的贡献可以直接统计sz[i]*sz[j]次),在连通块内用套路容斥出mst=0的边权方案数。

复杂度O(n^3).

uoj279 题目交流通道的更多相关文章

  1. uoj279题目交流通道(dp)

    题目大意: 神犇星球有 \(n\) 座小城.对于任意两座小城 \(v,u\)\((v≠u)\),吉米多出题斯基想在 \(v,u\) 之间建立一个传送时间为 \(w(v,u)\)的无向传送通道,其中 \ ...

  2. 【UTR #2】[UOJ#278]题目排列顺序 [UOJ#279]题目交流通道 [UOJ#280]题目难度提升

    [UOJ#278][UTR #2]题目排列顺序 试题描述 “又要出题了.” 宇宙出题中心主任 —— 吉米多出题斯基,坐在办公桌前策划即将到来的 UOI. 这场比赛有 n 道题,吉米多出题斯基需要决定这 ...

  3. UOJ279 【UTR #2】题目交流通道

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000  作者博客:http://www.cnblogs.com/ljh2000-jump ...

  4. 【UTR #2】题目交流通道

    题目描述 定好了难度,雄心勃勃的吉米多出题斯基开始寻找智慧的神犇星球的居民出题. 然而吉米多出题斯基没有料到,神犇星球的居民告诉吉米多出题斯基:"今年神犇星球经济不景气,大家都想宅在家里,哪 ...

  5. 【UOJ #279】【UTR #2】题目交流通道

    http://uoj.ac/problem/279 先判断答案为0的情况,\(d(i,i)\neq 0\),\(d(i,j)\neq d(j,i)\),\(d(i,j)>d(i,k)+d(k,j ...

  6. uoj#279. 【UTR #2】题目交流通道(容斥+数数)

    传送门 先考虑无解的情况,为以下几种:\(dis_{i,j}+dis_{j,k}<dis_{i,k}\),\(dis_{i,i}\neq 0\),\(dis_{i,j}\neq dis_{j,i ...

  7. UOJ Test Round #2

    昨天晚上打的这个比赛,简直一颗赛艇啊-- 感觉发挥的并不好.比赛的时候比较紧张,最后一题还脑残写了个离散化结果爆零了,哎我怎么这么逗逼-- 讲讲比赛经过吧. 比赛之前逗逼地以为是8:00开始,然后淡定 ...

  8. Noip模拟62 2021.9.26

    T1 Set 真就随机化拿了$90$?? 不过还是有依据的,毕竟这道题出解的几率很大,随出答案的概率也极大 所以不妨打一个随机化 1 #include<bits/stdc++.h> 2 # ...

  9. 2021.9.26考试总结[NOIP模拟62]

    T1 set 从\(0\)到\(n\)前缀余数有\(n+1\)个,但只有\(n\)种取值,找到一样的两个输出区间即可. \(code:\) T1 #include<bits/stdc++.h&g ...

随机推荐

  1. docker service 集群创建

    docker service create /新建docker集群--name webwork /集群的名称--replicas 3/ 启动3个节点--network my-network/ netw ...

  2. CocoaPods更新2018年11月06日16:06:48

    https://gems.ruby-china.org点进去就知道了…… CocoaPods命令 更新 sudo gem install -n /usr/local/bin cocoapods --p ...

  3. Worker Thread等到工作来,来了就工作

    Worker是“工人”的意思,worker thread pattern中,工人线程(worker thread)会一次抓一件工作来处理,当没有工作可做时,工人线程会停下来等待心得工作过来. Work ...

  4. Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)

    Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...

  5. ConvertBSTRToString导致的内存泄漏

    函数原型 char* __stdcall ConvertBSTRToString(BSTR pSrc); 这个指针指向的是一块动太分配的内存,如果把这个函数做为其它函数的参数,那么这块内存就会被泄漏掉 ...

  6. PHP算法之整数反转

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321示例 3: 输入: 120输出: 21注 ...

  7. next() 与 nextLine() 区别

    next() 与 nextLine() 区别 next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才 ...

  8. CSIC_716_20191031【计算机的组成】

    引言 什么是编程语言 语言是人与人之间的沟通介质之一,编程语言是人与机器(包括计算机)之间沟通的介质. 一个完整的计算机系统主要包括     应用程序  .操作系统  和硬件   等. 计算机三大核心 ...

  9. Neo4j 因果集群搭建及neo4j-java-driver连接

    搭建Neo4j因果集群 1.下载企业版,当前是3,5,9版本 https://neo4j.com/download-center/#enterprise 2.配置,三个核心集群为例 配置文件,conf ...

  10. 【JZOJ1667】【BZOJ1801】【luoguP2051】中国象棋

    description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮.请问有多少种放置方法?中国象棋中炮的行走方式大家应该很清楚吧. analysis \(DP\),容 ...