HDU4903 The only survival(计数神题)

探讨了如何在给定无向完全图中,根据边长设定,确保从1到n的最短路径等于特定值k的问题。通过枚举最短路径并应用排序和容斥原理来找到符合条件的方案数,对10^9+7取模。文章包含初步思路和代码,后续将补充详细解释。
摘要由CSDN通过智能技术生成

题目链接:HDU 4903
题目大意:给出n个点的无向完全图,确定每一条边的长度(1~L之间的任意数),使得1到n的最短路是k。输出方案数对1000000007取模,多组数据(组数<=5)。
题解:听过一遍没有懂,自己又琢磨了很长时间稍微懂了一些。
大概是先枚举1到每个点的最短路dis(优化之后变成枚举最短路为某个值的点有多少个),按dis排序后,从dis大的点向dis小的点连边,满足:对于任意dis[j] < dis[i]满足dis[j]+e(j,i)>=dis[i],并且存在dis[j] < dis[i]使得dis[j]+e(j,i)==dis[i],这个可以容斥(就是这个地方有点不大懂),现在还是有一点懵。
先把代码贴上吧,注释和详细题解之后再补。
code(有参考网上大神o(* ̄︶ ̄*)o )

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define mod 1000000007
#define ll long long
using namespace std;
int c[20][20],cnt[20],n,k,L,ans;
void pre()
{
    for (int i=0;i<
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值