| 
			
	
	
		一个航空公司为Ural州立大学80周年校庆提供了赞助。作为报答,航空公司希望Ural大学能帮他们一个忙。此公司开放n个机场,这些机场之间有若干条航线。为了简化工作,这些航线从1到M依次标号。如果两个机场之间有一条航线,那么飞机可以从其中任意一个机场起飞到另一个机场。任意两个机场之间只有可能有一条直达航线。 航空公司知道它们的飞机有可能吸引恐怖分子, 为了给恐怖分子制造一些麻烦,公司决定给航线编号的时候遵循一些特别的规则。如果有几条航线和同一个机场相关联,那么这些航线编号的最大公约数必须等于1。航空公司求助于你。 (记住,此公司是赞助商,你必须完全正确的解决这个问题。
 你的任务是写一个程序,找到符合要求的编号方法或确定不存在符合题意的编号方法。若存在多组编号方法,输出其中任意一个即可。
 
 input:
 输入的第一行包含两个用一个空格隔开的整数n和m (2 <= n <= 50)。 接下来的m 行包含了航线的信息。一条航线由它所连接的两个机场而唯一确定。机场编号之间用一个空格隔开。
 
 output:
 若存在一个可行的编号方法就在第一行输出'YES',否则输出'NO'。 如果答案是'YES',那么第二行应该输出一个可行的航线编号方案。编号顺序和航线在输入文件中出现的顺序一致。航线的编号之间用一个空格隔开。
 
 input:
 6 5
 1 2
 2 3
 2 4
 4 3
 5 6
 
 output:
 YES
 4 2 3 1 5
 
 注意:其实测试数据中没有NO的情况,还有连不连通没有关系的,直接用dfs一直搜到m即可。
 
 【参考程序】:
 
 #include<iostream>using namespace std;
 int n,m,num;
 bool use[51][51];
 int f[51][51],cnt[51][51],h[1250];
 void make(int now)
 {
 int k,t;
 if (num==m) return ;
 for (int i=1;i<=cnt[now][0];i++)
 {
 k=cnt[now][i];
 if (!use[k][now])
 {
 use[k][now]=use[now][k]=true;
 num++;
 t=f[now][k];
 h[t]=num;
 make(k);
 }
 }
 }
 int main()
 {
 scanf("%d%d",&n,&m);
 memset(cnt,0,sizeof(cnt));
 memset(use,false,sizeof(use));
 int a,b;
 for (int i=1;i<=m;i++)
 {
 scanf("%d%d",&a,&b);
 f[a][b]=i;cnt[a][0]++;cnt[a][cnt[a][0]]=b;
 f[b][a]=i;cnt[b][0]++;cnt[b][cnt[b][0]]=a;
 }
 num=0;
 make(1);
 printf("YES\n");
 for (int i=1;i<=m-1;i++)
 printf("%d ",h[i]);
 printf("%d\n",h[m]);
 return 0;
 }
 
 
   
	    
    
 |