杭电1269-Tarjan算法

来源:互联网 发布:拼图软件 编辑:程序博客网 时间:2024/06/06 00:51
此题用到了Tarjan算法  详见:http://www.cppblog.com/sosi/archive/2010/09/26/127797.aspx
<pre name="code" class="cpp">#include <iostream>#include <cstdio>#include <vector>#include<stack>using namespace std;#define maxn 20005int n,m;struct Node{int dnf;int visit;int low;int instack;int root;void init(){dnf=-1;visit=0;low=-1;instack=0;root=-1;}};int num,circle;stack<int>s;vector<int>mapp[maxn];Node stu[maxn];void Tarjan(int sum){s.push(sum);stu[sum].dnf=num++;stu[sum].visit=1;stu[sum].instack=1;stu[sum].low=stu[sum].dnf;for(int i=0;i<mapp[sum].size();i++){if(!stu[mapp[sum][i]].visit){Tarjan(mapp[sum][i]);stu[sum].low=min(stu[sum].low,stu[mapp[sum][i]].low);}else if(stu[mapp[sum][i]].instack){stu[sum].low=min(stu[sum].low,stu[mapp[sum][i]].dnf);}}if(stu[sum].low==stu[sum].dnf){int r;do{r=s.top();stu[r].root=circle;s.pop();stu[r].instack=0;}while(r!=sum);circle++;}}int main(){int i,j,n1,n2;while(~scanf("%d%d",&n,&m)&&(n||m)){for(i=0;i<maxn;i++){mapp[i].clear();stu[i].init();}while(s.size()){s.pop();}num=1;circle=0;for(i=1;i<=m;i++){scanf("%d%d",&n1,&n2);mapp[n1].push_back(n2);}for(i=1;i<=n;i++){if(!stu[i].visit)Tarjan(i);}if(circle==1)printf("Yes\n");else printf("No\n");}return 0;}


                                             
0 0
原创粉丝点击