0
点赞
收藏
分享

微信扫一扫

UOJ #134(【UR #9】App 管理器-tarjen+构造)

何晓杰Dev 2022-10-25 阅读 3


给一张混合图的无向边定向,使得原图强连通,题目保证有解。

显然,如果只有无向边,那么原图必边强连通,故用tarjen走一遍就行。
现在考虑有有向边的情况,
对于一条无向边,把它从图中删除,因为原图强连通,故
- 存在一条路径从u到v
- 存在一条路径从v到u
必然满足一条。
若只满足一条,就把边的另一个方向填上。
否则这条边删除不影响答案。

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define MEM(a) memset(a,0,sizeof(a));
#define MAXN (5000+10)
#define MAXM (2*MAXN)
typedef long long ll;
int n,m;

int Pre[MAXN]={0},Next[MAXM],edge[MAXM],siz=1;
void addedge(int u,int v) {
edge[++siz]=v;
Next[siz]=Pre[u];
Pre[u]=siz;
}
void addedge2(int u,int v) {addedge(u,v),addedge(v,u);}

bool b[MAXN];
int f[MAXN][MAXN];
void dfs(int x)
{
b[x]=1;
Forp(x){
int v=edge[p];
if (!b[v] && f[x][v] ) dfs(v);
}
}
int u[MAXN],v[MAXN],t[MAXN];
int main()
{
freopen("uoj134.in","r",stdin);
// freopen(".out","w",stdout);

MEM(f) MEM(b)

cin>>n>>m;
For(i,m)
{
scanf("%d%d%d",&u[i],&v[i],&t[i]);
addedge(u[i],v[i]); f[u[i]][v[i]]++;
if (!t[i]) addedge(v[i],u[i]),f[v[i]][u[i]]++;
}
For(i,m)
{
if (t[i]) t[i]=0;
else {
For(j,n) b[j]=0;
f[u[i]][v[i]]--;
dfs(u[i]);
if (b[v[i]]) {
t[i]= 1;
}else {
f[u[i]][v[i]]++;
f[v[i]][u[i]]--;
}
}
printf("%d\n",t[i]);
}
return 0;
}


举报

相关推荐

0 条评论