URAL 1040 Airline Company 构造,思路 难度:2

http://acm.timus.ru/problem.aspx?space=1&num=1040

题目要求在一个联通无向图中找出一种方法给边标号使得任意一个有多条边的点,边的号码的最大公约数都为1

想象在dfs树上,以1为根进入,将第一条边标为序号1,则节点1满足条件

剩下的边遵照dfs顺序表明,那么非叶节点一定满足从父亲到自身的树边和自身的另一条边序号相邻

所以直接dfs标号即可

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=51;
const int maxm=maxn*maxn;
int first[maxn];
struct edge{
        int f,t,ind,nxt;
}e[maxm];
int elen;
int ind[maxm];
void addedge(int f,int t,int ind){
        e[elen].f=f;
        e[elen].t=t;
        e[elen].ind=ind;
        e[elen].nxt=first[f];
        first[f]=elen++;
}
int n,m,cnt;
bool vis[maxn];
void dfs(int s){
        vis[s]=true;
        for(int p=first[s];p!=-1;p=e[p].nxt){
                if(ind[e[p].ind]==0){
                        ind[e[p].ind]=++cnt;
                        int t=e[p].t;
                        if(!vis[t]){
                                dfs(t);
                        }
                }
        }
}
int gcd(int a,int b){
        if(a<b)swap(a,b);
        if(b==0)return a;
        return gcd(b,a%b);
}
int main(){
        scanf("%d%d",&n,&m);
        memset(first,-1,sizeof(first));
        for(int i=0;i<m;i++){
                int f,t;
                scanf("%d%d",&f,&t);
                addedge(f,t,i);
                addedge(t,f,i);
        }
        dfs(1);
        for(int i=1;i<=n;i++){
                int g=-1;
                int len=0;
                 for(int p=first[i];p!=-1;p=e[p].nxt){
                        len++;
                        if(g==-1){
                                g=ind[e[p].ind];
                        }
                        else {
                                g=gcd(g,ind[e[p].ind]);
                        }
                }
                if(len>1&&g!=1){
                        puts("NO");
                        return 0;
                }
        }
        puts("YES");
        for(int i=0;i<m;i++){
                printf("%d%c",ind[i],i==m-1?‘\n‘:‘ ‘);
        }
        return 0;
}

  

时间: 2024-12-25 07:36:10

URAL 1040 Airline Company 构造,思路 难度:2的相关文章

商务系统的构造思路(无源码!)+如何用jsp实现点击单选框内容显示在另一个jsp页面

敲码经验总结: 之前犯了一个错误就是,没有从底层开始学起,有啥问题,就直接博客园找源码,去CSDN找源代码,看到代码就复制粘贴,结果从新梳理知识点的时候,貌似除了复制粘贴,印象深刻的知识啥也没学到. 看来代码这些东西还是得多敲多总结才有效,不要害怕从底层开始学起,因为没有底层的知识作为支撑,即使你能做出效果也不知道如何做出来,万不可知其然而不知其所以然. 好了,敲码经验总结结束了,现在到了知识点回顾: 总纲分成两个部分: 一.总体商务平台的构思 二.实现JSP点击单选按钮,内容显示到JSP里 细

POJ 1083 Moving Tables 思路 难度:0

http://poj.org/problem?id=1083 这道题题意是有若干段线段,每次要求线段不重叠地取,问最少取多少次. 因为这些线段都是必须取的,所以需要让空隙最小 思路: 循环直到线段全部取完,对于某个刚取得线段ij,下一个线段km取起点k尽量靠近j且满足k>j的.记录循环次数cnt,答案是cnt*10 注意: 房间是相对的,也就是说对于奇数房间号,利用的走廊相当于对应的偶数房间号开始的那一段路程, 一段路程的开头不能是另外一段路程的结尾. #include <cstdio>

URAL 2069 Hard Rock(思路)

题目地址:http://acm.timus.ru/problem.aspx?space=1&num=2069 思路:对于起点要么横着走,要么竖着走,则共有四种方式,直接竖横.横竖.先横后竖再横.现竖后横再竖,对于中间路径取最大值即可. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn

通过一个接口,来简单说下参数构造思路

先说一下背景 app上有一个功能是查询当前一周内产生的数据,对应的请求有2个必传参数:startDate 和 endDate 其中 startDate 为当前一周的开始日期,如"2019-12-02",endDate为当前一周的结束日期,如"2019-12-08" 所以这次要做的就是构造这两个参数 一个简单的思考过程 1.要获取到当前的日期 2.知道当前日期对应星期几 3.根据今天的日期倒推出星期一是几月几号 4.根据周一是几月几号,再向未来延6天,就可以知道周日是

HDU 2062 Subset sequence 数位dp,思路 难度:1

http://acm.hdu.edu.cn/showproblem.php?pid=2062 Subset sequence Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3569    Accepted Submission(s): 1802 Problem Description Consider the aggregate An=

SPOJ COMPANYS Two Famous Companies 最小生成树,二分,思路 难度:2

http://www.spoj.com/problems/COMPANYS/en/ 题目要求恰好有k条0类边的最小生成树 每次给0类边的权值加或减某个值delta,直到最小生成树上恰好有k条边为0,此时得到最小生成树的权值-更改的值*k即为答案 但是直接这么做的话会超时,因为都是整数权值,所以只需要优先取0类边,二分整数delta即可 如果直接给所有0类边减100,让0类边优先选择,那么会导致整棵树不一定是最小的,应该优先选择的1类边没有选择 #include <cstdio> #includ

URAL 1203 Scientific Conference 简单dp 难度:0

http://acm.timus.ru/problem.aspx?space=1&num=1203 按照结束时间为主,开始时间为辅排序,那么对于任意结束时间t,在此之前结束的任务都已经被处理,从这个时间开始的任务都正要被处理, 因为t<=3e5,可以用简单dp解决 #include <cstdio> #include <algorithm> using namespace std; const int maxn=1e5+5; int n; typedef pair&l

POJ 3279 Fliptile 状态压缩,思路 难度:2

http://poj.org/problem?id=3279 明显,每一位上只需要是0或者1, 遍历第一行的所有取值可能,(1<<15,时间足够)对每种取值可能: 对于第0-n-2行,因为上一行和本身行都已确定,所以可以确定下一行 最后检查第n-1行是否满足条件即可 #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace

php一句话后门过狗姿势万千之后门构造与隐藏【二】

第二章节主要带给大家一些后门构造思路,与安全狗文件特征检测的机制. 另外强调一下,这篇文章需要大家对于php有一定的认识. 本章节分为三大部分,第一部分针对初级,分析菜刀php代码的执行过程,较基础:第二部分主要总结一些可以利用的后门姿势,这部分我主要给大家分享一些搜集的后门,希望可以拓展大家的思路:第三部分主要分享后门隐藏之道. 声明:在后门举例中大部分后门构造与思路,可能网上都有类似的,如有雷同,来打我呀! 目前主流的waf软件(如安全狗)一般对于后门文件有主动查杀与被动查杀,主动好理解,被