</pre><dd><pre id="sample_output">
‘一笔画’即同时满足:1)连通;
2)度数为奇数的顶点数为0或2;
至于图的连通,可用并查集。以下代码用数组模拟并查集。
#include<stdio.h>
#include<string.h>
int s[1003][1007],A;
int main()
{
int a[10000],i,j,n,p,q,bz[10007];
int x,y,X,Y;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&p,&q);
A=0;
memset(a,0,sizeof(a));
memset(bz,0,sizeof(bz));
memset(s,0,sizeof(s));
for(i=0;i<q;i++)
{
scanf("%d%d",&x,&y);
X=-2;Y=-2;
for(j=0;j<A;j++)
{
if(s[j][x]==x&&bz[j]==0)X=j;
if(s[j][y]==y&&bz[j]==0)Y=j;
}
if(X==-2&&Y==-2)
{
s[A][y]=y;
s[A++][x]=x;
}
else if(X==-2&&Y!=-2)
{
s[Y][x]=x;
}
else if(Y==-2&&X!=-2)
{
s[X][y]=y;
}
else if(Y!=-2&&X!=-2&&X!=Y){
for(j=1;j<=p;j++)
if(s[Y][j]==j)
s[X][j]=j;
bz[Y]=3;
}
a[x]++;a[y]++;
}
int o=0,g=0;
for(i=0;i<A;i++)
if(bz[i]==0)
g++;
for(i=1;i<=p;i++)
if(a[i]%2==1)
o++;
if((o==0||o==2)&&g==1)printf("Yes\n");
else printf("No\n");
}
}
</pre><dd><pre id="sample_output">
‘一笔画’即同时满足:1)连通;
2)度数为奇数的顶点数为0或2;
至于图的连通,可用并查集。以下代码用数组模拟并查集。
#include<stdio.h> #include<string.h> int s[1003][1007],A; int main() { int a[10000],i,j,n,p,q,bz[10007]; int x,y,X,Y; scanf("%d",&n); while(n--) { scanf("%d%d",&p,&q); A=0; memset(a,0,sizeof(a)); memset(bz,0,sizeof(bz)); memset(s,0,sizeof(s)); for(i=0;i<q;i++) { scanf("%d%d",&x,&y); X=-2;Y=-2; for(j=0;j<A;j++) { if(s[j][x]==x&&bz[j]==0)X=j; if(s[j][y]==y&&bz[j]==0)Y=j; } if(X==-2&&Y==-2) { s[A][y]=y; s[A++][x]=x; } else if(X==-2&&Y!=-2) { s[Y][x]=x; } else if(Y==-2&&X!=-2) { s[X][y]=y; } else if(Y!=-2&&X!=-2&&X!=Y){ for(j=1;j<=p;j++) if(s[Y][j]==j) s[X][j]=j; bz[Y]=3; } a[x]++;a[y]++; } int o=0,g=0; for(i=0;i<A;i++) if(bz[i]==0) g++; for(i=1;i<=p;i++) if(a[i]%2==1) o++; if((o==0||o==2)&&g==1)printf("Yes\n"); else printf("No\n"); } }