Loading

Orientation ARC111 -D 强连通分量

Orientation ARC111 -D 强连通分量

题意

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

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

\[1\leq N \leq 100\\ 0\leq M \leq \frac{N(N-1)}{2}\\ 1\leq a_i,b_i \leq N\\ 1\leq c_i\leq 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("<-");
}
posted @ 2021-02-05 10:24  MQFLLY  阅读(96)  评论(0编辑  收藏  举报