题意:重新夺得Sylla之后,公司决定加强安保系统,就是建个运输网络,General要求这个网络必须满足每两个城市之间至少有三条独立的路线。(越看越像prison break)现在给你城市的坐标,让你判断合不合规定,复核规定就输出YES,不然就输出NO
思路:检查样例是不是三通路,其实就是把每个点去掉以后看看剩下的点有没有割点,如果有割点就是单通路,不符合规定,如果没有割点,就输是正确的。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
vector<int> N[505];
int Nsize,Msize;
int Low[505],Dfn[505],visit[505];
int depthn,root;
bool flag;
inline int min(int a,int b){return a<b?a:b;}
void dfs(int p,int fa)
{
int tol=0,v;
visit[p]=1;
Dfn[p]=Low[p]=depthn++;
for(vector<int>::iterator it=N[p].begin();it!=N[p].end();it++)
{
v=*it;
if(visit[v]==2) continue;
if(visit[v]==0)
{
dfs(v,p);tol++;
Low[p]=min(Low[p],Low[v]);
if((p==root&&tol>1)||(p!=root&&Low[v]>=Dfn[p]))
{
flag=true;
return ;
}
}
else if(visit[v]==1&&v!=fa)
Low[p]=min(Low[p],Dfn[v]);
}
}
int main()
{
cin.sync_with_stdio(false);
while(cin>>Nsize>>Msize&&(Nsize||Msize))
{
int temp1,temp2;
memset(Low,0,sizeof(Low));
memset(Dfn,0,sizeof(Dfn));
flag=false;
for(int i=0;i<Msize;i++)
{
cin>>temp1>>temp2;
N[temp1].push_back(temp2);
N[temp2].push_back(temp1);
}
for(int i=0;i<Nsize;i++)
{
memset(visit,0,sizeof(visit));
visit[i]=2;
root=0;depthn=0;
if(i==0) root=1;
dfs(root,-1);
for(int j=0;j<Nsize;j++)
{
if(visit[j]==0)
{
flag=true;
break;
}
}
if(flag)
break;
}
if(!flag)
cout<<"YES\n";
else
cout<<"NO\n";
for(int i=0;i<Nsize;i++)
N[i].clear();
}
return 0;
}