求改题解
  • 板块灌水区
  • 楼主lutaoquan2012
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/10/13 09:04
  • 上次更新2023/11/2 14:11:31
查看原帖
求改题解
952033
lutaoquan2012楼主2023/10/13 09:04
## 题意
给定一个图,一共有 $n$ 个点, $m$ 条边。
求其中最多的一条边被经过的数量。
## 思路
这道题呢,应该是个图论。
看下图:

![](https://cdn.luogu.com.cn/upload/image_hosting/h3czc457.png)

- 星星:指一条从放牧点 $($ 入读为 $0$ 的点 $)$ 到节点 $i$ 的方案数。

- 旗子:指一条从牛圈 $($ 出读为 $0$ 的点 $)$ 到节点 $i$ 的方案数。

由此可见,一条边 $(x,y)$ 的被经过的数目一定是节点 $x$ 的星星数量 $\times$ 节点 $y$ 旗子的数量。

- 节点 $x$ 的星星数量代表的是**前面经过这条边的数量**

- 节点 $y$ 的旗子数量代表的是**后面经过这条边的数量**

## 代码
```cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,ans;
ll p[1010][1010],q[1010][1010];//正向建图,反向建图
ll f[1010],g[1010];//前面的图里画的"星星","旗子"
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) f[i]=1;//一开始设所有地方都是牧场
    for(int i=1;i<=m;i++){
        ll u,v;
        cin>>u>>v;
        p[u][v]++;//正向建图
        q[v][u]++;//反向建图
        f[v]=0;//因为有边能到达 v ,所以 v 不可能是牧场。题目中给出入读为 0 的才是牧场
    }
    for(int i=1;i<=n;i++)//枚举每一个点
        for(int j=i+1;j<=n;j++) f[j]+=f[i]*p[i][j];//牧场到 j 的路径数目 = 所以能到 j 的牧场路径数目和
    g[n]=1;
    for(int i=n;i>=1;i--)//同上面求"星星数"一样,只不过是反着来的。
        for(int j=1;j<i;j++) g[j]+=g[i]*q[i][j];
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            if(p[i][j]) ans=max(ans,f[i]*g[j]);//求最值
    cout<<ans;
    return 0;
}
```

原因是 入度; 。

2023/10/13 09:04
加载中...