无向图 搜索割点
c++
中科大复试1704
#include <iostream>
#include <fstream>
using namespace std;
int gra[21][21]= {0};
void gprint(int k) //print graph
{
for(int i=1; i<=k; i++)
{
for(int j=1; j<=k; j++)
{
cout<<gra[i][j]<<'\t';
}
cout<<endl;
}
cout<<endl;
}
int first_nei(int n,int k)
{
for(int i=1; i<=k; i++)
{
if(gra[n][i]==1) return i;
}
return 0;
}
int next_nei(int m,int n,int k)
{
for(int i=m+1; i<=k; i++)
{
if(gra[n][i]==1) return i;
}
return 0;
}
void del(int n,int k)
{
for(int i=1; i<=k; i++)
{
if(gra[i][n]==1) gra[i][n]=-1;
if(gra[n][i]==1) gra[n][i]=-1;
}
}
void rebuild(int n,int k)
{
for(int i=1; i<=k; i++)
{
if(gra[i][n]==-1) gra[i][n]=1;
if(gra[n][i]==-1) gra[n][i]=1;
}
}
bool travel(int n,int k) //删掉的n节点
{
int m=n%5+1; //从下一个节点,广度优先遍历
int que[20];
int visited[k+1]= {0};
visited[0]=1; // *** 不访问此节点
visited[n]=1; //*** 不访问此节点
int in=0,out=0,t;
que[in++]=m;
while(in!=out)
{
t=que[out++];
visited[t]=1;
for(int i=first_nei(t,k); i!=0; i=next_nei(i,t,k))
{
if(!visited[i])
{
visited[i]=1;
que[in++]=i;
//cout<<i<<endl;
}
}
}
for(int i=1; i<=k; i++)
{
if(visited[i]==0) return false;
}
return true;
}
int main()
{
int k,m,n;
fstream in;
in.open("input4.txt");
in>>k;
for(int i=0; i<k; i++)
{
in>>m;
in>>n;
gra[m][n]=1;
gra[n][m]=1;
}
for(int i=1; i<=k; i++)
{
del(i,k);
//gprint(k);
if(!travel(i,k))
{
cout<<i<<endl;
return 0;
}
rebuild(i,k);
}
cout<<"cant find "<<endl;
/*
for(int i=1; i<=k; i++)
{
del(i,k);
gprint(k);
rebuild(i,k);
}
*/
//cout<<next_nei(3,5,k)<<endl;
//if(travel(5,k)) cout<<"!"<<endl;
//gprint(k);
//cout << "Hello world!" << endl;
return 0;
}