ural的几道题

来源:百度知道 编辑:UC知道 时间:2024/05/09 03:54:46
ural 1030,1040,1043,1091,1111,1141,1132,1189……
任何一道题的程序+注释,最好是c的……
到时间前提供最多的给分……
我的意思是大家给我发一下程序和注释……
626668……我这个问题放在了这个分类里显然不是问装甲车……
题目:http://acm.timus.ru/problemset.aspx?space=1&page=1
这是第一版……

我这里正好有杨弋大牛的ural1040解题报告
Ural 1040 Airline Company 的解题报告
【题目大意】
给定一个有e条边的无向图,要求你对这些边用1~e编号,使得每个度大于1的顶点所连接的边的编号的最大公约数为1。如果不可能则输出NO。
【分析和算法】
这题其实并没有无解的数据,而且可行解数目众多,搜索很容易出解。但是这题还有一个十分简便的构造法:
每次寻找一条极长路(即两头都不能再延长的路径),然后访问这条路,按照访问的先后顺序为边编上号,比如说,第一次找到一条边数为3的极长路,我们就将这3条边按顺序编上1、2、3,再比如说,第二次我们找到一条边数为4的极长路,那么这4条边就要被依次编号为4、5、6、7。然后,我们把找到的极长路从原图中删去,重复以上操作,直到边都被删光为止。这个算法的时间复杂度为O(n+e)。
下面给出这个算法的正确性的证明:
我们假设存在一个不符合条件的结点。
首先,这个结点一定不在我们找的任意一条极长路上。因为相邻的正整数互质。
由我们的假设,这个结点度至少为2。
由以上两个结论我们可以推出:这个结点处在至少两条极长路的两端。但是由我们对极长路的定义,这是不可能的。从而,这个算法是正确的。

#include <iostream.h>
#include <string.h>
#define maxn 50

long data[maxn+1][maxn+1];
long flag[maxn+1][maxn+1];
long stack[maxn*maxn+1],sp;
long result[maxn*maxn+1];

int main () {
        long n,m,i,a,b,j,used;

        memset(flag,0,sizeof(flag));
  &nb