Ural 1040 Airline Company(构造)
2017-10-06 20:21
323 查看
题目地址:http://acm.timus.ru/problem.aspx?space=1&num=1040
思路:
1.无向连通图满足从一点出发的边数大于1的边,其标号的最大公约数为1。
2.直接从任意点开始dfs,直接按dfs顺序给所有边标号即可(对于一点相连的两条边,dfs时必有一条边进入该点,一条边离开该点,即其标号相差1,而相邻两数其gcd为1,满足条件)。
思路:
1.无向连通图满足从一点出发的边数大于1的边,其标号的最大公约数为1。
2.直接从任意点开始dfs,直接按dfs顺序给所有边标号即可(对于一点相连的两条边,dfs时必有一条边进入该点,一条边离开该点,即其标号相差1,而相邻两数其gcd为1,满足条件)。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define debug using namespace std; const int maxn=50+10; struct Edge { int to,id,nt; }; int head[maxn]; int n,m,tot,cnt; int ans[maxn*maxn]; int vis[maxn*maxn]; Edge edge[maxn*maxn]; void addEdge(int u,int v,int id) { edge[tot].to=v,edge[tot].nt=head[u]; edge[tot].id=id,head[u]=tot++; } void dfs(int u) { for(int i=head[u]; ~i; i=edge[i].nt) { int nt=edge[i].to; if(!vis[edge[i].id]) { vis[edge[i].id]=1; ans[edge[i].id]=++cnt; dfs(nt); } } } int main() { #ifdef debu freopen("in.txt","r",stdin); #endif // debug tot=0; memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1; i<=m; i++) { int x,y; scanf("%d%d",&x,&y); addEdge(x,y,i); addEdge(y,x,i); } dfs(1); printf("YES\n"); for(int i=1; i<=m; i++) { if(i==1) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf("\n"); return 0; }
相关文章推荐
- URAL 1040 Airline Company 构造,思路 难度:2
- URAL 1040 Airline Company
- URAL 1040: Airline Company
- URAL1040 - Airline Company - dfs+思维
- URAL 1995 Illegal spices 贪心构造
- URAL 1032 A - Find a Multiple——抽屉原理+构造
- 【构造】URAL 1979 Resources Distribution
- URAL 1995 Illegal spices 贪心构造
- URAL 1549 Another Japanese Puzzle(构造)
- [构造 找规律 孔明棋] Ural 1051 Simple Game on a Grid
- URAL 1040
- 【构造】URAL 2004 Scientists from Spilkovo
- Ural 2045 Richness of words(构造)
- 【构造】 URAL 1495 One-two, One-two 2
- URAL 1779 F - The Great Team 构造
- URAL 1779 The Great Team 构造题
- UESTC 1040 Great Inversion 逆序数、构造
- URAL 1737 Mnemonics and Palindromes 3 构造
- ural 1667 Square Country 3,构造
- URAL1995-Illegal spices(贪心构造)