【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104696
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

一个航空公司为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;
}


posted on 2009-06-13 17:32 开拓者 阅读(309) 评论(0)  编辑 收藏 引用 所属分类: URAL 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理