1077. Travelling Tours

2023-10-14 07:40
文章标签 1077 travelling tours

本文主要是介绍1077. Travelling Tours,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1077. Travelling Tours

Time limit: 1.0 second Memory limit: 64 MB
There are   N  cities numbered from 1 to   N  (1 ≤  N ≤ 200) and   M  two-way roads connect them. There are at most one road between two cities. In summer holiday, members of DSAP Group want to make some traveling tours. Each tour is a route passes   K  different cities ( K > 2)   T 1,   T 2, …,   TK  and return to   T 1. Your task is to help them make   Ttours such that:
  1. Each of these T tours has at least a road that does not belong to (T−1) other tours.
  2. T is maximum.

Input

The first line of input contains   N  and   M  separated with white spaces. Then follow by   M  lines, each has two number   H  and   T  which means there is a road connect city   Hand city   T.

Output

You must output an integer number   T — the maximum number of tours. If   T > 0, then   T  lines followed, each describe a tour. The first number of each line is   K — the amount of different cities in the tour, then   K  numbers which represent   K  cities in the tour.
If there are more than one solution, you can output any of them.

Sample

inputoutput
5 7
1 2
1 3
1 4
2 4
2 3
3 4
5 4
3
3 1 2 4
3 1 4 3
4 1 2 3 4
Problem Author: Nguyen Xuan My (Converted by Dinh Quang Hiep and Tran Nam Trung)   Problem Source: From the third contest at Department of Mathematics and Informatics - Natural Sciences College - National University of HaNoi.
***************************************************************************************
并查集;
每次求出一个环后,标记结点,直到找出所有的环
***************************************************************************************
 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<vector>
 8 using namespace std;
 9 int head[1001],fa[1001];
10 int n,m,i,j,k,cnt;
11 int link[1001][1001];//联系数组
12 int  vis[1001];//标记结点所用
13 vector<int>ans[180000];//存储结果
14 void make()
15 {
16     for(int it=0;it<=n;it++)
17      {
18          fa[it]=it;
19          link[it][0]=0;
20          ans[it].clear();
21      }
22 }
23 int find(int x)//并查集
24  {
25      if(fa[x]!=x)
26         fa[x]=find(fa[x]);
27      return fa[x];
28  }
29  void  work(int x,int y)
30   {
31       memset(vis,0,sizeof(vis));
32       memset(head,-1,sizeof(head));//前驱存储
33       head[x]=-1;
34       vis[x]=1;
35       queue<int>Q;
36       Q.push(x);
37       while(!Q.empty())
38        {
39            int h=Q.front();
40            Q.pop();
41            if(h==y)
42             {
43                 ans[cnt].push_back(y);
44                 for(int it=head[y];it!=-1;it=head[it])
45                  ans[cnt].push_back(it);
46                  cnt++;
47                  return;
48             }
49             for(int it=1;it<=link[h][0];it++)
50              {
51                  int gs=link[h][it];//把没访问的节点放入队列
52                  if(!vis[gs])
53                   {
54                       Q.push(gs);
55                       vis[gs]=1;
56                       head[gs]=h;
57                   }
58              }
59 
60        }
61 
62 
63   }
64   int main()
65   {
66       cin>>n>>m;
67       int x,y;
68        cnt=0;
69        make();
70       for(i=1;i<=m;i++)
71        {
72            cin>>x>>y;
73            int fs=find(x);
74            int ds=find(y);
75            if(fs==ds)
76             {
77                 work(x,y);
78             }
79            else
80            {
81                link[x][++link[x][0]]=y;
82                link[y][++link[y][0]]=x;
83                fa[fs]=ds;
84            }
85 
86         }
87     cout<<cnt<<endl;
88     for(i=0;i<cnt;i++)
89      {
90          int hs=ans[i].size();
91          cout<<hs<<' ';
92          for(j=0;j<hs;j++)
93             cout<<ans[i][j]<<' ';
94          cout<<endl;
95       }
96     return 0;
97 
98   }
View Code

 

转载于:https://www.cnblogs.com/sdau--codeants/p/3283676.html

这篇关于1077. Travelling Tours的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/209094

相关文章

九度1077(最大序列和)

题目链接:点击打开链接 解题思路: 很经典的一道题。首先考虑一下细节问题,当序列都是0时,显然最后要输出0;当序列都是负数时,显然要输出最大的数。 细节处理完了,就可以回到正常轨道。我们开两个变量,分别保存当前的序列和与之前的最大值,我们更新当前序列和的条件是如果当前序列和是负数的时候,那我们必须更新,否则一定会使最后结果减小。更新过程中还要更新之前最大值即可。 完整代码:

每日一题——Python实现PAT甲级1077 Kuchiguse(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 总结 我要更强 方案1:利用字典树(后缀树) 优化代码(后缀树实现) 代码点评 时间复杂度分析 空间复杂度分析 方案2:水平扫

uva 1077 - The Sky is the Limit(离散化)

题目链接:uva 1077 - The Sky is the Limit 代码 #include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int maxn = 200005;const double eps = 1e-8;struct Point {

zoj 2027 Travelling Fee

题意:求从起点除法到终点的最少费用,题目比一般的最短路径多了个限制条件,可以免去花费最多的一条边的费用。 思路:用一个数组maxi[i][j]记录从i到j的路径中,一条路最多花费多少,将递推式改成 edge[i][j] = min (edge[i][k] + edge[k][j] - max(maxi[i][k],maxi[k][j]) , edge[i][j] - maxi[i][j])

1077: 平衡二叉树的判定

解法: 平衡二叉树是一种特殊的二叉树,它满足以下两个条件: 左子树和右子树的高度差不超过1(即,左右子树高度差的绝对值不超过1)。左子树和右子树都是平衡二叉树。 后序遍历过程中每次判断左右子树高度差和1的关系即可 #include<iostream>using namespace std;struct treeNode {char val;treeNode* left, * rig

1077 员工薪水(1)

#include<iostream>using namespace std;int main(){int t;cin>>t;if(t<=40)cout<<30*t<<endl;elsecout<<30*1.5*(t-40)+t*30<<endl;return 0;}

POJ 1077 Eight

链接:http://poj.org/problem?id=1077 题目: Language: Default Eight Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 23382 Accepted: 10325 Special Judge Description The 15-puzzle has bee

Web Tours系统使用说明书

1.系统简介 产品名称:LoadRunner的Web Tours系统 产品功能:注册和登录用户信息、订票办理、退片办理、查询已定票信息、退出系统 系统默认用户:用户名jojo 密码:bean 2. 功能简介 2.1 注册用户信息 点击 sign up now: 进入注册页面: 注册完成点击Continue 2.2 登录网站 登录成功后显示 2.3 用户订票 点击Fight

【PAT】1077. Kuchiguse (20)

题目描述 The Japanese language is notorious for its sentence ending particles. Personal preference of such particles can be considered as a reflection of the speaker’s personality. Such a preference is c

hdu 3001 Travelling TSP变形 三进制状压dp

// hdu 3001 TSP问题的变形// 这次到每个点最多两次,所以可以用三进制的类推// dp[S][u]表示当前在u点访问状态为S时所得到的最小的开销// 采用刷表法,即用当前的状态推出它所能转移的状态// dp[S][u] 可以到达的状态为dp[S+state[v]][v](dist[u][v]!=inf)// dp[S+state[v]][v] = max(dp[S+stat