百度了一下,竟然如此简单。
只要节点延伸出去的边有相邻的数字,则无论有多少条边,其最大公约数一定是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]);
}