UVALIVE 2954 Task Sequences

竞赛图:图中的任意两点间有且仅有一条有向弧连接

求竞赛图中的哈密顿路的算法:

首先,由数学归纳法可证竞赛图在n>=2时必存在哈密顿路;

(1)n=2时显然;

(2)假设n=k时,结论成立,哈密顿路为V1,V2,...,Vi,...,Vk;

现添加第k+1个结点,若存在弧<Vi,Vk+1>和弧<Vk+1,Vi+1>,则可得哈密顿回路V1,V2,...,Vi,Vk+1,Vi+1,...,Vk;

若不存在上述的vi,考虑到Vk+1与v1~vk的连通状况,则只有下面种原哈密顿路的情况:

1.所有的Vi(1<i<k)与Vk+1的弧的方向都是<Vi,Vk+1>,那么可得哈密顿回路V1,V2,...,Vi,...,Vk,Vk+1;

2.所有的Vi(1<i<k)与Vk+1的弧的方向都是<Vk+1,Vi>,那么可得哈密顿回路Vk+1,V1,V2,...,Vi,...,Vk;

3.存在一个中间结点m,使得所有的Vi(1<=i<=m)与Vk+1的弧方向为<Vk+1,Vi>,所有的

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
#define MAXN 1010
int next[MAXN],head;
string res;
int pick[MAXN][MAXN];
int N;
int main()
{
        while (cin >> N)
        {
                memset(next,0,sizeof(next));
                getline(cin,res);
                for (int i =  1; i <= N; i++)
                {
                        getline(cin,res);
                        for (int j = 1; j <= N; j++)
                           pick[i][j] = res[(j -1) * 2] - ‘0‘;
                }
                head = 1;
                int tmp;
                for (int k = 2; k <= N; k++)
                {
                        bool found =false;
                        for (int i = head; i ; i = next[i])
                        {
                                if (pick[k][i])
                                {
                                        if (i == head) head = k;
                                        else next[tmp] = k;
                                        next[k] = i;
                                        found = true;
                                        break;
                                }
                                else tmp = i;
                        }
                        if (!found) next[tmp] = k;
                }
                cout << "1" << endl << N << endl;
                for (int i = head; i ; i = next[i])
                {
                        if (i == head) cout << i;
                        else cout << ‘ ‘ << i;
                }
                cout  << endl;
        }
        return 0;
}

Vj(m<j<=k)与Vk+1的弧的方向为<Vj,Vk+1>,这时依然可以构造哈密顿路 V1,V2,...,Vi,...,Vk,Vk+1;

时间: 2024-08-19 02:06:14

UVALIVE 2954 Task Sequences的相关文章

poj 1776 Task Sequences

http://poj.org/problem?id=1776 题意: 有一个机器要完成N个作业, 给你一个N*N的矩阵, M[i][j]=1,表示完成第i个作业后不用重启机器,继续去完成第j个作业 M[i][j]=0,表示如果做完第i个作业,想要继续去做第j个作业,那么必须重启机器 对于任意两个作业都有M[i][j] = 1或者M[j][i] = 1. 求出完成这N个作业启动机器的最少次数,以及每次启动完成作业的数量和这些作业的顺序 初始时机器处于关闭状态. 将M当做图,就是找最少的路径条数覆盖

UVALive 4885 Task 差分约束

题目链接:点击打开链接 题意: 有n个任务 m个限制条件 1.task i starts at least A minutes later than task j 表示 i - j >= A 2.task i starts within A minutes of the starting time of task j 表示 i - j <= A 问:每个任务开始的时间. 求一个任意解 思路: 差分约束,对于不等式形如: 点u,v : 常数C 有: u - v <= C 则从v->u

poj 1776 Task Sequences(哈密顿路)

题意:给定一个邻接矩阵,即一幅有向图(有环),问最少的覆盖路径为几条,求出遍历顺序: 思路:竞赛图存在哈密顿路,一定能找到一条遍历所有点的路. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int mm[1005][1005]; char ch[1005]; int nxt[50010]; int n,m; int main() { int i,j,k,head,t

题单二:图论500

http://wenku.baidu.com/link?url=gETLFsWcgddEDRZ334EJOS7qCTab94qw5cor8Es0LINVaGMSgc9nIV-utRIDh--2UwRLvsvJ5tXFjbdpzbjygEdpGehim1i5BfzYgYWxJmu ==========  以下是最小生成树+并查集=========================[HDU]1213         How Many Tables        基础并查集★1272         小

图论五百题!

生死看淡不服就淦,这才是人生! =============================以下是最小生成树+并查集======================================[HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing Roads 基础最小生成树★1232 畅通工程 基

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

MDT 2013 从入门到精通之客户端映像捕获

今天为大家带来有关客户端WIM模板的抓取内容,本章内容完成后,有关MDT常规部署的操作就基本够用了,期间会插播一系列有关MDT 2013Update1 Preview部署windows 10系列博文,希望大家喜欢.后期会紧接MDT 2013从入门到精通系列之SQL高级部署及自定制DIY系列教程. 客户端映像捕获: 一.捕获任务创建: 1.右键Task Sequences ,选择"New Task Sequence": 2.输入任务ID及任务名称: 3.选择"Sysprep a

Windows 2008R2 +MDT2013+WDS(2)

上一次我们已经添加了镜像,下面我们开始添加计算机的驱动程序.我们可以到计算机的官网去把计算机的各个系统的驱动程序下载下来 4.2.3打开MDT的工作目录里,我们按照下面的图示打开Out-of-Box Drivers,在右侧的工作台选择导入驱动程序 在弹出的对话框中,选择出我们下载好的驱动程序放在的目录.这里有个需要补充的,我们平时下载的驱动程序很多是.exe的文件,可以使用解压软件把驱动程序加压出来,形成一个文件夹. 提示有三个报错,一般可以不理会. 5 增加安装任务. 打开工作台,选择Task

图论精炼500题

忘了从哪转的了... =============================以下是最小生成树+并查集====================================== [HDU] 1213               How Many Tables                    基础并查集★ 1272               小希的迷宫                     基础并查集★ 1325&&poj1308    Is It A Tree?