zoukankan      html  css  js  c++  java
  • SGU 122.The book (哈密顿回路)

    题目描述

         有一群人从1到N标号,而且这群人中每个人的朋友个数不少于 (N+1)/2 个。

    编号为1的人有一本其他人都想阅读的书。

    写一个程序,找到一种传阅顺序使得书本只经过每个人手中一次,并且一个人只能将书本传给他的朋友,并且书本最后必须传回给第一个人。(注释:如果A是B的朋友,那么B一定是A的朋友)

    输入

          第一行包含一个数字N。

    接下来的有N行,第i行表示第i-1个人的朋友

    输出

         如果不存在解决方案,则输出 'No solution' 。否则你将输出1行包含N+1个整数,表示传阅路径,由1开始、由1结尾。

    输入样例

    4

    2 3

    1 4

    1 4

    2 3

    输出样例

    1 3 4 2 1


    Solution:

                每个人至少有(n+1)/2 个朋友,一定存在哈密顿回路.

                找到哈密顿路后,从1 的位置开始输出,最后再输出一个1.

    code:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #define INF 1111
    using namespace std;
    bool edge[INF][INF];
    int ans[INF], vis[INF];
    int n, tol = 2, t, s = 1;
    void expand() {
    	int i;
    	while (1) {
    		for (i = 1; i <= n; i++) {
    			if (edge[t][i] && !vis[i]) {
    				ans[tol++] = i;
    				t = i, vis[i] = 1;
    				break;
    			}
    		}
    		if (i > n) return;
    	}
    }
    void Hamiton() {
    	int i, j;
    	for (i = 1; i <= n; i++) if (edge[s][i]) break;
    	t = i;
    	ans[0] = s, ans[1] = t;
    	vis[s] = vis[t] = 1;
    	while (1) {
    		expand();
    		reverse (ans, ans + tol);
    		swap (s, t);
    		expand();
    		if (!edge[s][t]) {
    			for (i = 1; i < tol - 2; i++)
    				if (edge[ans[i]][t] && edge[ans[i + 1]][s]) break;
    			reverse (ans + i + 1, ans + tol);
    			t = ans[tol - 1];
    		}
    		if (tol == n) return;
    		for (j = 1; j <= n; j++) {
    			if (vis[j]) continue;
    			for (i = 1; i < tol - 1; i++)
    				if (edge[ans[i]][j])	break;
    			if (edge[ans[i]][j]) break;
    		}
    		s = ans[i - 1], t = j;
    		reverse (ans, ans + i);
    		reverse (ans + i, ans + tol);
    		ans[tol++] = j, vis[j] = 1;
    	}
    }
    int main() {
    	char ci;
    	scanf ("%d", &n);
    	for (int i = 1; i <= n; i++) {
    		scanf ("%d", &t);
    		edge[i][t] = edge[t][i] = 1;
    		ci = getchar();
    		while (ci != '
    ' && ci != '
    ' && ci != EOF)
    			scanf ("%d", &t), edge[i][t] = edge[t][i] = 1, ci = getchar();
    	}
    	Hamiton();
    	int i;
    	for (i = 0; i < n; i++)
    		if (ans[i] == 1) break;
    	for (int j = 0; j < n; j++) {
    		printf ("%d ", ans[i]);
    		i++;
    		if (i == n) i = 0;
    	}
    	putchar ('0' + 1);
    	return 0;
    }
    

      

  • 相关阅读:
    Do You See Me? Ethical Considerations of the Homeless
    ELDER HOMELESSNESS WHY IS THIS AN ISSUE?
    Endoflife support is lacking for homeless people
    html内联框架
    html字体
    html块 div span
    html列表
    html表格
    SQL Server管理员专用连接的使用   作为一名DBA,经常会处理一些比较棘手的服务无响应问题,鉴于事态的严重性,多数DBA可能直接用“重启”大法,以便尽快的恢复生产环境的正常运转,但是多数情况
    如何配置最大工作线程数 (SQL Server Management Studio)
  • 原文地址:https://www.cnblogs.com/keam37/p/3835911.html
Copyright © 2011-2022 走看看