小b準備設計施工方案。設計圖是乙個n
n個點m m
條邊的圖,小b每次施工可以取圖中乙個還沒有完工的生成森林把它完工。為了加快施工效率,每次取的時候小b都會最大化當前這個生成森林的邊數。請你幫他找出乙個符合要求的施工方案。如果有多個方案,輸出任意一種即可。
第一行兩個整數n
n, m m
。後面m
m行,每行兩個數ai,
biai,bi
表示一條邊,保證沒有自環。
m m
行,每行乙個整數,表示這條邊屬於第幾次。如果有多個方案,輸出任意一種即可。
input
5 7output1 22 3
3 44 5
1 22 3
1 2
111201322
% 20%
的分數滿足n
≤1000,m
≤1000
n≤1000,m≤1000。
40%40%
的分數滿足n≤10
4,m≤
104n≤104,m≤104。
80%80%
的分數滿足n≤10
5,m≤
105n≤105,m≤105。
100% 100%
的分數滿足n≤10
6,m≤
106n≤106,m≤106。
1s, 512mb
題解
先說什麼是生成森林,就是所以的生成樹組成生成森林,一顆樹也算乙個森林。然後就看加邊的過程,由於有好多相同的邊,所以前往後一顆樹一棵樹的列舉,如果它們的father不是同乙個數,就可以加進去,因為樹上不能有環。用了二維並查集,fa[i][j]表示第i個點在第i棵樹的根,為了省空間開了乙個mem存第二維,每個節點i開du[i]個空間,能充分利用,注意用指標要從0開始,選樹時候可以二分。
#include#include#include#includeusing namespace std;
const int maxn=1000010;
int mem[maxn*2],*iter=mem,*fa[maxn],u[maxn],v[maxn],du[maxn];
int find(int x,int id)
int main()
for(int i=1;i<=n;i++)
int ans=l;
printf("%d\n",ans+1);
fa[find(x,ans)][ans]=find(y,ans);
}return 0;
}
暑期個人賽 第二場 A
時間限制 1000 ms 記憶體限制 65536 kb 丁神要去google上班了,去之前丁神想再做一道水題,但時間不多了,所以他希望題目做起來既水又快。現在一共有 n 道題,編號從1到 n 每道題有兩個值 a 和 b a 為做這道題需要的時間,b 為題目的 水值 丁神希望做b a 最大的那題。輸入...
省賽選拔賽 組隊賽第二場
rank 5。2013年通化全國邀請賽的題。比賽時出了2道題,打完之後才知道杭電g 編譯器有問題,d題同樣的 c 能ac,g 一直超時。一開始a題交了好久次才過罰時好多,一著急就亂了,改乙個地方就提交,這個必須改。a hdu 4493 給出12個月的工資,求平均薪水,貌似是因為資料大和浮點數精度問題...
暑期個人賽 第二場 C
時間限制 1000 ms 記憶體限制 65536 kb 現有一段橫向長度為n的山脈,其中每段有乙個獨一無二的高度hi 1到n之間的正整數 現在你想知道對於長度為n的山脈,可能有這樣的山脈多少種。這樣的山脈是 某個位置要麼比兩邊的高度都低,要麼比兩邊的高度都高。兩座山脈 a和 b 不同當且僅當存在乙個...