Connected Graph
Time Limit: | 2000MS | Memory Limit: | 65536K |
Description
一个无向图G,给定N个顶点,其中一些顶点之间有边相连。希望知道图G是否为连通图。
Input
首先,第一行输入整数N和E。 N表示顶点个数(1≤N≤100), 顶点标号为1,2,…,N。E表示边数(1≤E≤5000)。
接下来有E行,每行有两个顶点标号u和v,表明u和v是相邻关系。
Output
如果图G是连通图,输出YES,否则,输出NO。
Sample Input
9 10
2 4
5 7
1 3
8 9
1 2
5 6
2 3
7 9
6 8
6 9
Sample Output
NO
Hint
No hint.
Source
解题代码:
#include<iostream>
using namespace std;
int find(int *&A,int a,int b)
{
if(A[a]==A[b])
if(A[a]==-1)
return 0;
else
return 1;
else
return 2;
}
void unite(int *&A,int a,int b,int n,int &t,int k)
{
if(k==0)
{
A[a]=t;
A[b]=t++;
}
else if(k==2)
{
if(A[a]==-1)
A[a]=A[b];
else if(A[b]=-1)
A[b]=A[a];
else
{
int f=A[b];
for(int i=0;i<n;i++)
{
if(A[i]==f)
A[i]=A[a];
}
}
}
}
int main()
{
int n,e;
int a,b;
int t=1;
cin>>n>>e;
int *A=new int[++n];
for(int i=0;i<n;i++)
A[i]=-1;
while(e-->0)
{
cin>>a>>b;
unite(A,a,b,n,t,find(A,a,b));
}
if(A[1]==-1)
{cout<<"NO\n";
return 0;
}
for(int i=2;i<n;i++)
{
if(A[i]!=A[1])
{
cout<<"NO\n";
return 0;
}
}
cout<<"YES\n";
}
欢迎大牛指教!!!