ZOJ 1395 Door Man

这是一道关于欧拉回路欧拉通路的非常好的一个题,能很好的理解他的算法,现在把黑书上的核心知识打出来:

 

无向图的欧拉回路: 如果一个无向图所有顶点的度为偶数,那么该图可以用起始点与终点相同的一笔画出,这一笔经历的的路线叫做无向图的欧拉回路。

 

有向图的欧拉回路:如果一个有向图的所有顶点的入度等于出度,那么该图可以用起始点与终点相同的一笔画出,这一笔经历的路线叫做有向图的欧拉回路。

 

无向图的欧拉路:如果一个无向图恰有两个顶点x,y的度为奇数,那么该图可以用起始点于x与终点于y的一笔画出,这一笔经历的路线叫做无向图的欧拉路。

 

有向图的欧拉路:在一个有向图中,顶点x出度比入度大1,顶点y的入度比出度大1,其余所有点的顶点入度等于出度那么该图可以用起始点于x与终止点与y的一笔画出,这一笔经历的路线叫做有向图的欧拉路。

 

很清楚了吧?

 

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> int main(void) { int len,start,n; int i,j,to; int mat[21],cnt,odd; char c[100],; while ( scanf("%s",c) && strcmp(c,"ENDOFINPUT") ) { scanf("%d%d",&start,&n);getchar(); memset(mat,0,sizeof(mat)); for( i = 0,cnt=0; i < n; i++ ) { gets(c); len = strlen(c); if( len == 0 ) continue; for( j = 0;j <= len;j++ ) { to = 0; while( isdigit(c[j]) ) to = to * 10 + c[j++] - '0'; mat[i]++; mat[to]++; cnt++; } } gets(c); for( odd=i=0; i <n; i++) if( mat[i]%2 ) odd++; if( odd > 2 || odd == 1 ) printf("NO/n"); else if( odd == 2 ) (start && mat[start]%2&&mat[0]%2)?printf("YES %d/n",cnt):printf("NO/n"); else start==0?printf("YES %d/n",cnt):printf("NO/n"); } return 0; }

你可能感兴趣的:(c,算法)