强联通 HDU 2767 3836

本文介绍了一种计算最少需要添加多少条边使图变为强连通的方法。若图中有a个节点入度为0,b个节点出度为0,则所需添加的边数为a和b的最大值。特殊情况,若图已强连通则无需添加边。

n个点m条边

最少需要几条边变成强连通图

设有a个结点的入读为0, b个结点的出度为0, 则 max{a, b}就是答案。 注意特殊情况: 当原图已经强连通时, 答案是0而不是1.

加一条边少一个入度出度

  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<string.h>
  4 #include<queue>
  5 #include<math.h>
  6 #include<stack>
  7 
  8 using namespace std;
  9 
 10 #define MAXN 100010
 11 
 12 int head[MAXN],low[MAXN],dfn[MAXN],f[MAXN],in[MAXN],out[MAXN];
 13 bool vis[MAXN];
 14 int cnt,k,num;
 15 struct edg
 16 {
 17     int fr,to,next;
 18 
 19 }x[MAXN];
 20 
 21 void add(int u,int v)
 22 {
 23     x[cnt].next=head[u];
 24     x[cnt].fr=u;
 25     x[cnt].to=v;
 26     head[u]=cnt++;
 27 }
 28 stack<int>s;
 29 
 30 void dfs(int u)
 31 {
 32     low[u]=dfn[u]=k++;
 33     vis[u]=1;
 34     s.push(u);
 35     int i;
 36     for(i=head[u];i!=-1;i=x[i].next)
 37     {
 38         int t=x[i].to;
 39         if(!dfn[t])
 40         {
 41             dfs(t);
 42             low[u]=min(low[u],low[t]);
 43         }
 44         else if(vis[t])
 45             low[u]=min(low[u],dfn[t]);
 46     }
 47     if(low[u]==dfn[u])
 48     {
 49         num++;
 50         while(!s.empty())
 51         {
 52             int now=s.top();
 53             s.pop();
 54             vis[now]=0;
 55             f[now]=num;
 56             if(now==u)break;
 57         }
 58     }
 59 }
 60 
 61 int main()
 62 {
 63     int n,m,t;
 64 
 65     while(scanf("%d%d",&n,&m)!=EOF)
 66     {
 67         int i;
 68         memset(head,-1,sizeof(head));
 69         cnt=0;
 70         for(i=1;i<=m;i++)
 71         {
 72             int a,b;
 73             scanf("%d%d",&a,&b);
 74             add(a,b);
 75         }
 76         k=1;
 77         num=0;
 78         memset(dfn,0,sizeof(dfn));
 79         memset(low,0,sizeof(low));
 80         memset(vis,0,sizeof(vis));
 81         memset(f,0,sizeof(f));
 82         for(i=1;i<=n;i++)
 83         {
 84             if(!dfn[i])
 85                 dfs(i);
 86         }
 87         memset(head,-1,sizeof(head));
 88         int en=cnt;
 89         memset(in,0,sizeof(in));
 90         memset(out,0,sizeof(out));
 91 
 92         for(i=0;i<en;i++)
 93         {
 94             int u,v;
 95             u=f[x[i].fr];
 96             v=f[x[i].to];
 97             if(u!=v)
 98             {
 99                 add(u,v);
100                 out[u]++;
101                 in[v]++;
102             }
103         }
104         int a,b;
105         a=b=0;
106 
107         for(i=1;i<=num;i++)
108         {
109             if(in[i]==0)
110                 a++;
111             if(out[i]==0)
112                 b++;
113         }
114         if(num==1)
115             printf("0\n");
116         else
117             printf("%d\n",max(a,b));
118     }
119     return 0;
120 }

 

转载于:https://www.cnblogs.com/cherryMJY/p/6058804.html

在车辆工程中,悬架系统的性能评估和优化一直是研究的热点。悬架不仅关乎车辆的乘坐舒适性,还直接影响到车辆的操控性和稳定性。为了深入理解悬架的动态行为,研究人员经常使用“二自由度悬架模型”来简化分析,并运用“传递函数”这一数学工具来描述悬架系统的动态特性。 二自由度悬架模型将复杂的车辆系统简化为两个独立的部分:车轮和车身。这种简化模型能够较准确地模拟出车辆在垂直方向上的运动行为,同时忽略了侧向和纵向的动态影响,这使得工程师能够更加专注于分析与优化与垂直动态相关的性能指标。 传递函数作为控制系统理论中的一种工具,能够描述系统输入和输出之间的关系。在悬架系统中,传递函数特别重要,因为它能够反映出路面不平度如何被悬架系统转化为车内乘员感受到的振动。通过传递函数,我们可以得到一个频率域上的表达式,从中分析出悬架系统的关键动态特性,如系统的振幅衰减特性和共振频率等。 在实际应用中,工程师通过使用MATLAB这类数学软件,建立双质量悬架的数学模型。模型中的参数包括车轮质量、车身质量、弹簧刚度以及阻尼系数等。通过编程求解,工程师可以得到悬架系统的传递函数,并据此绘制出传递函数曲线。这为评估悬架性能提供了一个直观的工具,使工程师能够了解悬架在不同频率激励下的响应情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值