DUToj1221 A quest with no intelligence(欧拉回路)

1 篇文章 0 订阅


1221: A quest with no intelligence

Time Limit:3000/1000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)  Special Judge
Total Submissions:36   Accepted:8

[Submit][Status][Discuss]

Description

斯雷恩星是塔达林星灵(Tal’darim)的母星。在这座星球上,塔达林在地嗪裂隙旁建造了很多城市(地嗪是一种塔达林必须的资源)。但是实际上每个城市对地嗪的需求量不是十分固定的,而地嗪裂隙产生的地嗪量也不是稳定的。因此经常出现地嗪过少或过剩的情况。

现在,高阶领主阿拉纳克打算好好搞一搞建设,因此他要重新激活毁坏已久的城市间的折跃通路(一种单向路)来运输地嗪,使得尽可能多的城市处于地嗪供需稳定状态。对于每一条折跃通路,他需要决定这一条通路的方向,而且他必须激活每一条通路。一个城市处于地嗪供需稳定状态当且仅当进入这个城市的折跃通路和离开这个城市的折跃通路数目相等。

由于塔达林星灵普遍没有智力,唯一有智力的阿拉纳克需要你帮助他解决这个问题。如果你能解决这个问题,他可能会给你塔达林智力之链第一人的名号。

Input

第一行包括一个整数q(q≤20)q(q≤20),代表数据组数。

每组数据的第一行2个整数n,m(1≤n≤200,1≤m≤n(n−1)2)m(1≤n≤200,1≤m≤n(n−1)2),表示城市数目和折跃通路数目。

接下来m行每行2个整数ui,vi(1≤ui,vi≤n)vi(1≤ui,vi≤n),代表在城市ui,vi之间有一条折跃通路需要决定方向。

数据中不会出现重边和自环。

本题数据组数:3。

 

Output

第一行一个整数,表示最多有多少个城市处于地嗪供需稳定状态。

接下来mm行,每行2个整数ai,biai,bi,表示在ui,viui,vi之间的能量通路的方向是从ai到biai到bi的。

对于具体的通路方向,答案可能不唯一,任意输出一个即可。

 

Sample Input

1
6 6
1 2
3 2
3 4
5 4
5 1
1 6

Sample Output

4
1 2
2 3
3 4
4 5
5 1
1 6

HINT

 

Source

Codeforces

 

CF原题地址:http://codeforces.com/contest/723/problem/E

题意:给一个无向图的边添加方向,使入度与出度相等的点尽量多。

首先因为每条边都必须添加方向,则度数为奇数的边不可能符合要求。且若一个无向图只有度数为偶数的边,则其bi

 

必存在欧拉回路 欧拉回路不会的同学看这里——>:https://blog.csdn.net/qq_34454069/article/details/77779300

所以对于每两个奇数度数的点如果有边就任意定向,无边就加边,则剩下的图可以生成欧拉回路。按欧拉回路确定边方向可以使所有偶数度的点入度等于出度。然后删去多加的边即可。

代码:

    	    			
        	    			
#include<bits/stdc++.h>
using namespace std;
int du[220];
int maze[220][220];int n,m;int alen;int addu[220],addv[220];int vis[220];
int q[100000][2]; 
void dfs(int x){
	for(int i=1;i<=n;i++)
	{
		if(maze[x][i]&&maze[i][x]){
			maze[i][x]=0;
			dfs(i);
		}	
	
	}		vis[x]=1;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		memset(du,0,sizeof(du));int u,v;alen=0;
		memset(maze,0,sizeof(maze));
		memset(vis,0,sizeof(vis));	
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&u,&v);
			q[i][0]=u;		q[i][1]=v;
			maze[u][v]=maze[v][u]=1;
			du[u]++;du[v]++;
		 } 
		 int ni=1;int ans=n;
		 for(int i=1;i<=n;i++)if(du[i]&1) ans--;
		 while(ni<=n)
		 {
		 	if(du[ni]&1){
		 		for(int i=ni+1;i<=n;i++)
		 		{
		 			if((du[i]&1)){
		 				du[ni]--;du[i]--;		 				
		 				if(maze[i][ni]==1){
		 				maze[ni][i]=0;					
						 }
						else{
							addu[alen]=i;addv[alen]=ni;alen++;
							maze[i][ni]=maze[ni][i]=1;
						}
		 				i=ni+1;//ans-=1;flag=1;
		 			//	break;
					 }
					 
				 }
			 }
			 else{
			 	ni++;
			 }
		 }
		 printf("%d\n",ans);
		 for(int i=1;i<=n;i++)
		 {
		 	if(!vis[i])
		 	{
		 		dfs(i);
			 }
		 }
		 for(int i=0;i<alen;i++)
		 {
		 	maze[addu[i]][addv[i]]=maze[addv[i]][addu[i]]=0;
		 }
		 for(int i=1;i<=m;i++)
		 {
		 			if(maze[q[i][0]][q[i][1]]==1) printf("%d %d\n",q[i][0],q[i][1]);
		 			else{
		 				printf("%d %d\n",q[i][1],q[i][0]);
					 }
		 }

		 
	}
 } 		
    		
    

 

(边要求按读入顺序输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值