#include <bits/stdc++.h>
using namespace std;
const int maxn=10010;
vector<int>gra[maxn];
int dfn[maxn],low[maxn],ind,v,e;
bool instack[maxn];
stack<int>s;
void init()//点从1开始
{
ind=0;
for(int i=1;i<=v;i++)
{dfn[i]=-1;low[i]=-1;}
while(!s.empty())s.pop();
memset(instack,false,sizeof instack);
int c1,c2;
for(int i=1;i<=v;i++)
gra[i].clear();
for(int i=0;i<e;i++)
{
cin>>c1>>c2;
gra[c1].push_back(c2);
}
}
void tarjan(int u)
{
dfn[u]=low[u]=ind++;
s.push(u);
instack[u]=true;
for(int i=0;i<gra[u].size();i++)
{
if(dfn[gra[u][i]]==-1)
{
tarjan(gra[u][i]);
low[u]=min(low[u],low[gra[u][i]]);
}
else if(instack[gra[u][i]])
low[u]=min(low[u],dfn[gra[u][i]]);
}
if(low[u]==dfn[u])
{
s.pop();
instack[u]=false;
}
}
int main()
{
while(cin>>v>>e,v!=0)
{
init();
for(int i=1;i<=v;i++)
{
if(dfn[i]==-1)tarjan(i);
}
}
return 0;
}
塔杨板子
最新推荐文章于 2024-08-21 23:14:57 发布