Ural1040

百度了一下,竟然如此简单。

只要节点延伸出去的边有相邻的数字,则无论有多少条边,其最大公约数一定是1。

所以直接dfs给边从1到m编上号即可。

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;

vector<int> V[51];
int ans[2505];
int c;
int counter;
int m,n;
int vstd[51][51];
int edge[51][51];

void dfs(int pos)
{
	int i;
	for (i=0;i<V[pos].size();i++)
	{
		if (!vstd[pos][V[pos][i]])
		{
			vstd[pos][V[pos][i]]=vstd[V[pos][i]][pos]=1;
		  ans[edge[pos][V[pos][i]]]=++counter;
		  dfs(V[pos][i]);
		}
	}
}

int main()
{
	scanf("%d%d",&n,&m);
	int i;
	for (i=0;i<=m-1;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		V[a].push_back(b);
		V[b].push_back(a);
		edge[a][b]=edge[b][a]=i+1;
	}
	dfs(1);
	printf("YES\n");
	for (i=1;i<=m-1;i++)
		printf("%d ",ans[i]);
	printf("%d\n",ans[i]);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值