zoukankan      html  css  js  c++  java
  • Orientation ARC111 -D 强连通分量

    Orientation ARC111 -D 强连通分量

    题意

    给定(N)个点(M)条边的有向图,现在重新设置边的方向,给出点(a_i,b_i)来分配边的方向。

    给出(c_i)表示(i)点可以被多少点访问到。

    [1leq N leq 100\ 0leq M leq frac{N(N-1)}{2}\ 1leq a_i,b_i leq N\ 1leq c_ileq N ]

    分析

    对于给定的(a,b),若(c_a > c_b)显然(a->b),反之亦然

    (c_a = c_b)则两点必在同一个强连通分量里,直接dfs一遍即可

    代码

    int a[10005],b[10005],c[205],mp[205][205];
    int vis[205];
    int ans[205];
    int n,m;
    
    void dfs(int x){
    	vis[x] = 1;
    	for(int i = 1;i <= n;i++){
    		if(mp[x][i]) {
    			mp[i][x] = 0;
    			if(!vis[i]) dfs(i);
    		}
    	}
    }
    
    int main(){
    	n = rd();
    	m = rd();
    	for(int i = 1;i <= m;i++)
    		a[i] = rd(),b[i] = rd();
    	for(int i = 1;i <= n;i++)
    		c[i] = rd();
    	for(int i = 1;i <= m;i++){
    		if(c[a[i]] > c[b[i]])
    			ans[i] = 1;
    		else if(c[a[i]] < c[b[i]])
    			ans[i] = -1;
    		else mp[a[i]][b[i]] = mp[b[i]][a[i]] = 1;
    	}
    	for(int i = 1;i <= n;i++)
    		if(!vis[i]) dfs(i);
    	for(int i = 1;i <= m;i++){
    		if(mp[a[i]][b[i]]) 
    			ans[i] = 1;
    		else if(mp[b[i]][a[i]])
    			ans[i] = -1;
    	}
    	for(int i = 1;i <= m;i++)
    		if(ans[i] == 1) puts("->");
    		else puts("<-");
    }
    
  • 相关阅读:
    微信小程序设置控件权重
    从外部浏览开启app
    对rxandroid的简单理解
    react native TextInput
    使用广播来进行刷新页面
    react native中对props和state的理解
    android中四大组件之间相互通信
    android tab选项卡的使用
    android控件 ToggleButton的应用
    Listview的使用
  • 原文地址:https://www.cnblogs.com/hznumqf/p/14376306.html
Copyright © 2011-2022 走看看