这道题正着做反着做都可以。
正着做要强连通分量缩点,可是T了一个大数据。可能是我写得有问题。
#include
#include
#include
#include
#include
#include
#define MAXN 100002
using namespace std;
int n,m,zz,head[MAXN],cnt,hd[MAXN];
struct bian{int to,nx;} e[MAXN],E[MAXN];
int pre[MAXN],low[MAXN],sccnum[MAXN],ct,scc;
int stack[MAXN],v[MAXN],in[MAXN],top,done[MAXN];
//------------------------------------------------------------------
void insert(int x,int y)
{zz++; e[zz].to=y; e[zz].nx=head[x]; head[x]=zz;}
void init()
{
scanf("%d%d",&n,&m);
int i,x,y;
for(i=1;i<=m;i++)
{scanf("%d%d",&x,&y);
insert(x,y);
}
}
//----------------------------------------------------------------------------
void dfs(int x)
{
pre[x]=low[x]=++ct;
stack[++top]=x;
int i,p;
for(i=head[x];i;i=e[i].nx)
{p=e[i].to;
if(!pre[p]) {dfs(p); low[x]=min(low[x],low[p]);}
else if(!sccnum[p]) low[x]=min(low[x],pre[p]);
}
p=-1;
if(low[x]==pre[x])
{scc++;
while(p!=x)
{p=stack[top]; top--;
sccnum[p]=scc; v[scc]=max(v[scc],p);
}
}
}
void tarjan()
{
int i;
for(i=1;i<=n;i++)
{if(!pre[i]) dfs(i);}
//for(i=1;i<=n;i++) printf("%d ",sccnum[i]);
//printf("\n");
//system("pause");
}
void rebuild()
{
int x,i,p;
for(x=1;x<=n;x++)
for(i=head[x];i;i=e[i].nx)
{p=e[i].to;
if(sccnum[x]!=sccnum[p])
{cnt++; E[cnt].to=sccnum[p]; E[cnt].nx=hd[sccnum[x]]; hd[sccnum[x]]=cnt;
in[sccnum[p]]++;
}
}
//for(i=1;i<=scc;i++) printf("%d ",in[i]);
//printf("\n");
//system("pause");
}
//------------------------------------------------------------------------------
void find(int x)
{
if(done[x]) return;
int i,p;
done[x]=1;
for(i=hd[x];i;i=E[i].nx)
{p=E[i].to;
find(p);
v[x]=max(v[x],v[p]);
}
}
void work()
{
int i;
for(i=1;i<=scc;i++)
{if(in[i]==0) find(i);}
for(i=1;i<=n;i++)
{printf("%d",v[sccnum[i]]);
if(i
反着做只要保证每个点走一次即可。
#include
#include
#include
#include
#include
#include
#define MAXN 100002
using namespace std;
int n,m,zz,head[MAXN];
struct bian{int to,nx;} e[MAXN];
int ans[MAXN],done[MAXN];
void insert(int x,int y)
{zz++; e[zz].to=y; e[zz].nx=head[x]; head[x]=zz;}
void init()
{
scanf("%d%d",&n,&m);
int i,x,y;
for(i=1;i<=m;i++)
{scanf("%d%d",&x,&y);
insert(y,x);
}
}
void dfs(int x)
{
if(done[x]) return;
int i,p;
done[x]=1;
for(i=head[x];i;i=e[i].nx)
{p=e[i].to;
if (!done[p])
{ans[p]=max(ans[p],ans[x]);
dfs(p);
}
}
}
void work()
{
int i;
for(i=n;i>=1;i--) ans[i]=i;
for(i=n;i>=1;i--) dfs(i);
for(i=1;i<=n;i++) printf("%d ",ans[i]);
}
int main()
{
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
init(); work();
return 0;
}