您的位置:首页 > 移动开发

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

2015-10-05 21:40 405 查看
给一张混合图的无向边定向,使得原图强连通,题目保证有解。

显然,如果只有无向边,那么原图必边强连通,故用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: