ZOJ 3321
来源:互联网 发布:庄聚贤 知乎 编辑:程序博客网 时间:2024/05/16 02:53
图的“草根”解法
#include<stdio.h>
#include<string.h>
int bsearch(int *A,int *B,int x1,int y1,int v)
{
int x=x1,y=y1,m;
while(x<y)
{
m=x+(y-x)/2;
if(A[m]==v)
return(m);
else
if(A[m]>v)
y=m;
else
x=m+1;
}
x=x1;y=y1;
while(x<y)
{
m=x+(y-x)/2;
if(B[m]==v)
return(m);
else
if(B[m]>v)
y=m;
else
x=m+1;
}
}
int main()
{
int i,j,t,t1,t2,m,n;
int a[15],b[20],c[20];
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a)); //将数组a初始化,用于记录每个结点edges的数目//
for(i=1,j=1;i<=m;i++,j++)
{
scanf("%d%d",&t1,&t2);
a[t1]++; //记录输入结点edges的数目//
a[t2]++;
b[j]=t1;
c[j]=t2;
}
for(i=1;i<=n;i++)
if(a[i]!=2)
break;
if(n<3||n!=m||i<n) //如果所有结点刚好连成一个圆环,则从1到n每个结点
{ 都应该有且仅有两个edges即a[i]==2(i=1,...,n)//
printf("NO\n");
continue;
}
a[1]=b[1]; //a[i]用于存储以b[1]为初始结点的圆环上的各个结点,方法是在
a[2]=c[1]; 数组b和c中查找a[i]的相邻结点a[i+1],通过调用bsearch函数
b[1]=0; 返回值为a[i]在b(或c)数组中的位置k,则a[i+1]即为c[k](或
c[1]=0; b[k]),赋值a[++i]=c[k](或b[k]),之后将b[k],c[k]赋0,若能
i=2; 构成一个圆环,则最终b和c数组中所有元素均为0//
do
{
t=bsearch(b,c,1,m+1,a[i]);
if(b[t]==a[i])
{
a[++i]=c[t];
b[t]=0;
c[t]=0;
}
else
{
a[++i]=b[t];
b[t]=0;
c[t]=0;
}
}while(a[i]!=a[1]);
for(i=1;i<=m;i++)
if(b[i]!=0||c[i]!=0)
break;
if(i<=m)
printf("NO\n");
if(i>m)
printf("YES\n");
}
return(0);
}
- zoj 3321
- ZOJ 3321
- zoj 3321 Circle
- ZOJ 3321 Circle【模拟】
- ZOJ 3321 Circle
- zoj 3321 - Circle
- ZOJ 3321Circle
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- 沙盘Sandboxie 原理分析
- 我想把自己托付出去
- iOS越狱教程备忘
- 6、telnet从PC机LINUX的远程登录简单方法
- Android新浪微博开发(三)主UI的实现:用BaseAdapter做适配器的LsitView
- ZOJ 3321
- 7、挂载(mount)命令使用技巧
- Android--Listview横向滑动
- 8、关于终端中文的方法
- 查询所有子节点,包含节点本身(遍历树形菜单)
- VC CDC 加载位图 伸缩位图 源代码
- 9、实现虚拟机与PC机共享最简单方法
- 谷歌 chrome浏览器眼睛保护色设置
- 用flex & bison (lex & yacc)创建可重入(线程安全)的词法分析和语法解析器