上海交大-“Code人心弦”9月网络赛-OddGraph

Description

Pangzi looks somehow odd recently. He started to love odd things, like odd numbers and odd graphs. He says, an odd graph is a non-empty graph (that is the set of vertices is non-empty) that every vertex has an odd degree (that is, connected to an odd number of edges). If a graph is not odd, he will try to find a subgraph that is odd. In Pangzi's mind, a subgraph of a graph G=(V, E) is composed by some vertices in G and all edges between these vertices from G. Mathematically, G'=(V', E') where V' is a subset of V and E'={(u, v): u, v in V' and (u, v) in E}.

Now Pangzi will give you a graph, please tell him if this graph is odd. If it is not odd, try to find an odd subgraph.

Pay attention. As Pangzi is odd now, when he talks about graphs, he is actually talking about undirected graphs.

Input Format

The first line of the input is an integer T (T <= 100), indicating the number of test cases.

Then, T test cases follow. For every test case, the first line is 2 integers n, m (1 <= n <= 100, 0 <= m <= 1000). Then m lines follow, every line contains 2 integers u, v (1<=u, v<=n) indicating an edge in G.

There is no self-loop or parallel edge.

Output Format

Output the answer for each test case.

  • If the graph is an odd graph, output "ODD GRAPH".
  • If the graph is not odd and contains an odd subgraph, output the subgraph in the following format. First output a number K, the vertices in this subgraph, and then output K integers in increasing order representing the vertices. These numbers should be printed in one line and separated by one space. No extra spaces. If there are multiple solutions, first minimize K, and if there are still multiple solutions, output the lexicographically smallest sequence of vertices.
  • If the graph is not odd and contains no odd subgraph, output "NO ODD SUBGRAPH"

For two sequences a[1], a[2], ..., a[K] and b[1], b[2], ..., b[k], a is lexicographically smaller than b if and only if for the smallest i such that a[i] != b[i], a[i] < b[i].

See the sample output for clarifications.

Sample Input

3
1 0
4 4
1 2
2 3
3 4
4 1
2 1
1 2

Sample Output

NO ODD SUBGRAPH
2 1 2
ODD GRAPH

Case Limits

Time limit: 500 msec

Memory limit: 64 MB

题意:给你一个无向图,如果所有顶点的度都为奇数,则输出ODD GRAPH,否则找该图的子图是否存在满足条件的,存在则输出最少顶点数和对应顶点的序号,否则输出NO ODD SUBGRAPH。

思路:用x[i]记录i顶点的度,map[i][j]记录顶点i和j之间有几条边,遍历x数组判断是否为ODD GRAPH,是则输出,否则继续判断子图,若存在,最小子图的顶点数必然为2,因此从顶点1往下找即可。

#include<stdio.h>
#include<string.h>
int map[122][122];
int x[122];
int main()
{	
	int n,m,t,i,j,a,b;	
	while(scanf("%d",&t)!=EOF)	
	{		
		while(t--)		
		{			
			scanf("%d%d",&n,&m);			
			if(m==0)			
			{				
				printf("NO ODD SUBGRAPH\n");				
				continue;		
			}
			memset(x,0,sizeof(x));		
			memset(map,0,sizeof(map));			
			for(i=0;i<m;i++)			
			{				
				scanf("%d%d",&a,&b);				
				x[a]++;				
				x[b]++;				
				map[a][b]++;				
				map[b][a]++;			
			}		
			int flag=0;			
			for(i=1;i<=n;i++)	
			{			
				if(x[i]%2==0)		
				{			
					flag=1;		
					break;		
				}		
			}		
			int flag1,xx,yy;		
			if(flag==1)	
			{			
				flag1=0;	
				for(i=1;i<=n;i++)	
				{			    
					for(j=i+1;j<=n;j++)		
					{					
						if(map[i][j]%2==1)	
						{					
							flag1=1;		
							xx=i;			
							yy=j;	
							break;		
						}				
					}				
					if(flag1==1)			
						break;			
				}		
			}		
			else		
				printf("ODD GRAPH\n");		
			if(flag1==1)		
			{			
				printf("2 %d %d\n",xx,yy);		
				flag1=2;			
			}			
			if(flag==0&&flag1==0)				
				printf("NO ODD SUBGRAPH\n");	
		}
	}
	return 0;
}


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员囧辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值