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("<-");
}