hdoj 2767 Proving Equivalences【求scc&&缩点】【求最少添加多少条边使这个图成为一个scc】
2015-09-19 10:00
381 查看
Proving Equivalences
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4263 Accepted Submission(s):
1510
[align=left]Problem Description[/align]
Consider the following exercise, found in a generic
linear algebra textbook.
Let A be an n × n matrix. Prove that the
following statements are equivalent:
1. A is invertible.
2. Ax = b has
exactly one solution for every n × 1 matrix b.
3. Ax = b is consistent for
every n × 1 matrix b.
4. Ax = 0 has only the trivial solution x = 0.
The typical way to solve such an exercise is to show a series of
implications. For instance, one can proceed by showing that (a) implies (b),
that (b) implies (c), that (c) implies (d), and finally that (d) implies (a).
These four implications show that the four statements are
equivalent.
Another way would be to show that (a) is equivalent to (b)
(by proving that (a) implies (b) and that (b) implies (a)), that (b) is
equivalent to (c), and that (c) is equivalent to (d). However, this way requires
proving six implications, which is clearly a lot more work than just proving
four implications!
I have been given some similar tasks, and have already
started proving some implications. Now I wonder, how many more implications do I
have to prove? Can you help me determine this?
[align=left]Input[/align]
On the first line one positive number: the number of
testcases, at most 100. After that per testcase:
* One line containing
two integers n (1 ≤ n ≤ 20000) and m (0 ≤ m ≤ 50000): the number of statements
and the number of implications that have already been proved.
* m lines with
two integers s1 and s2 (1 ≤ s1, s2 ≤ n and s1 ≠ s2) each, indicating that it has
been proved that statement s1 implies statement s2.
[align=left]Output[/align]
Per testcase:
* One line with the minimum number
of additional implications that need to be proved in order to prove that all
statements are equivalent.
[align=left]Sample Input[/align]
2
4 0
3 2
1 2
1 3
[align=left]Sample Output[/align]
4
2
题意:n个点m条边的有向图,问最少增加多少边使图强连通。
题解:求每个scc的入度和出度,然后分别求出入度中0的个数in和出度out,取in和out中较大的一个;
因为入度或出度为0证明这个scc和别的scc未相连,需要用一条边相连,这条边就是要加入的边,又因为一个scc可能连接多个scc,即只考虑入度或者只考虑出度都不准确
和昨天做的那道题一模一样,今天再做一遍 就当练练手吧
#include<stdio.h> #include<string.h> #include<algorithm> #include<vector> #include<stack> #define MAX 50010 #define INF 0x3f3f3f using namespace std; struct node { int beg,end,next; }edge[MAX]; int low[MAX],dfn[MAX]; int n,m,ans; int sccno[MAX],instack[MAX]; int dfsclock,scccnt; vector<int>newmap[MAX]; vector<int>scc[MAX]; int head[MAX]; int in[MAX],out[MAX]; stack<int>s; void init() { ans=0; memset(head,-1,sizeof(head)); } void add(int u,int v) { edge[ans].beg=u; edge[ans].end=v; edge[ans].next=head[u]; head[u]=ans++; } void getmap() { int a,b,i; while(m--) { scanf("%d%d",&a,&b); add(a,b); } } void tarjan(int u) { int v,i,j; s.push(u); instack[u]=1; dfn[u]=low[u]=++dfsclock; for(i=head[u];i!=-1;i=edge[i].next) { v=edge[i].end; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { scccnt++; while(1) { v=s.top(); s.pop(); instack[v]=0; sccno[v]=scccnt; if(v==u) break; } } } void find(int l,int r) { memset(low,0,sizeof(low)); memset(dfn,0,sizeof(dfn)); memset(instack,0,sizeof(instack)); memset(sccno,0,sizeof(sccno)); dfsclock=scccnt=0; for(int i=l;i<=r;i++) { if(!dfn[i]) tarjan(i); } } void suodian() { int i; for(i=1;i<=scccnt;i++) { newmap[i].clear(); in[i]=0;out[i]=0; } for(i=0;i<ans;i++) { int u=sccno[edge[i].beg]; int v=sccno[edge[i].end]; if(u!=v) { newmap[u].push_back(v); in[v]++; out[u]++; } } } void solve() { int i; if(scccnt==1) { printf("0\n"); return ; } else { int inn=0; int outt=0; for(i=1;i<=scccnt;i++) { if(!in[i]) inn++; if(!out[i]) outt++; } printf("%d\n",max(inn,outt)); } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(); getmap(); find(1,n); suodian(); solve(); } return 0; }
相关文章推荐
- 使用uiautomation自动化重命名pdf书签,使全大写字母变成首字母大写
- iOS UIGestureRecognizer手势总结
- CAShapeLayer与UIBezierPath
- requirejs的用法
- 用UIImgeView播放gif图
- phpcmsv9更改fckeditor编者ueditor编辑
- 3 sequence containers in STL
- OS每天15个注意点系列之UI-界面布局
- uva 540(Team Queue)
- easyUi 教程资料分享
- UITableView判断reloadData结束(iOS)
- hdoj 3836 Equivalent Sets【scc&&缩点】【求最少加多少条边使图强连通】
- String,StringBuffer,StringBuilder
- UITabBarController笔记(UITabBar/UITabBarButton)
- 从一个登陆页跳转到一个具有多个导航页面的工具栏控制器UITabbarController中
- Android中全局搜索(QuickSearchBox)详解
- 理解newid()和newsequentialid()
- easyUI——datagrid的动态显示和隐藏
- iOS UI基础-9.2 UITableView 简单微博列表
- iOS UIImageRenderingMode