【BZOJ】1638: [Usaco2007 Mar]Cow Traffic 奶牛交通(dfs+dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1638
一条边(u, v)经过的数量=度0到u的数量×v到n的数量
两次记忆化dfs算出他们即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> using namespace std; #define rep(i, n) for(int i=0; i<(n); ++i) #define for1(i,a,n) for(int i=(a);i<=(n);++i) #define for2(i,a,n) for(int i=(a);i<(n);++i) #define for3(i,a,n) for(int i=(a);i>=(n);--i) #define for4(i,a,n) for(int i=(a);i>(n);--i) #define CC(i,a) memset(i,a,sizeof(i)) #define read(a) a=getint() #define print(a) printf("%d", a) #define dbg(x) cout << #x << " = " << x << endl #define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; } inline const int getint() { int r=0, k=1; char c= getchar (); for (; c< '0' ||c> '9' ; c= getchar ()) if (c== '-' ) k=-1; for (; c>= '0' &&c<= '9' ; c= getchar ()) r=r*10+c- '0' ; return k*r; } inline const int max( const int &a, const int &b) { return a>b?a:b; } inline const int min( const int &a, const int &b) { return a<b?a:b; } const int N=5005, M=50005; int n, m, ihead[N], cnt, in[N], f1[N], f2[N], a[M], b[M]; struct ED { int to, next; }e[M]; void add( int u, int v) { e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v; } void dfs1( int x) { if (ihead[x]==0) f1[x]=1; for ( int i=ihead[x]; i; i=e[i].next) { if (!f1[e[i].to]) dfs1(e[i].to); f1[x]+=f1[e[i].to]; } } void dfs2( int x) { if (ihead[x]==0) f2[x]=1; for ( int i=ihead[x]; i; i=e[i].next) { if (!f2[e[i].to]) dfs2(e[i].to); f2[x]+=f2[e[i].to]; } } int main() { read(n); read(m); for1(i, 1, m) { int u=getint(), v=getint(); a[i]=u, b[i]=v; add(u, v); in[v]=1; } for1(i, 1, n) if (!in[i]) dfs1(i); CC(ihead, 0); cnt=0; for1(i, 1, m) add(b[i], a[i]); dfs2(n); int ans=0; for1(i, 1, m) ans=max(ans, f1[b[i]]*f2[a[i]]); print(ans); return 0; } |
Description
农 场中,由于奶牛数量的迅速增长,通往奶牛宿舍的道路也出现了严重的交通拥堵问题.FJ打算找出最忙碌的道路来重点整治. 这个牧区包括一个由M (1 ≤ M ≤ 50,000)条单行道路(有向)组成的网络,以及 N (1 ≤ N ≤ 5,000)个交叉路口(编号为1..N),每一条道路连接两个不同的交叉路口.奶牛宿舍位于第N个路口.每一条道路都由编号较小的路口通向编号较大的路 口.这样就可以避免网络中出现环.显而易见,所有道路都通向奶牛宿舍.而两个交叉路口可能由不止一条边连接. 在准备睡觉的时候,所有奶牛都从他们各自所在的交叉路口走向奶牛宿舍,奶牛只会在入度为0的路口,且所有入度为0的路口都会有奶牛. 帮助FJ找出最忙碌的道路,即计算所有路径中通过某条道路的最大次数.答案保证可以用32位整数存储.
Input
第一行:两个用空格隔开的整数:N,M.
第二行到第M+1行:每行两个用空格隔开的整数ai,bi,表示一条道路从ai到bi.
Output
第一行: 一个整数,表示所有路径中通过某条道路的最大次数.
Sample Input
7 7
1 3
3 4
3 5
4 6
2 3
5 6
6 7
1 3
3 4
3 5
4 6
2 3
5 6
6 7
Sample Output
4
样例说明:
1 4
\ / \
3 6 -- 7
/ \ /
2 5
通向奶牛宿舍的所有路径:
1 3 4 6 7
1 3 5 6 7
2 3 4 6 7
2 3 5 6 7
样例说明:
1 4
\ / \
3 6 -- 7
/ \ /
2 5
通向奶牛宿舍的所有路径:
1 3 4 6 7
1 3 5 6 7
2 3 4 6 7
2 3 5 6 7
HINT
Source
博客地址:www.cnblogs.com/iwtwiioi 本文为博主原创文章,未经博主允许不得转载。一经发现,必将追究法律责任。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!