题目链接: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<