日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 5490. 【清华集训2017模拟11.28】图染色

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 5490. 【清华集训2017模拟11.28】图染色 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

Input

第一行包括兩個整數N,M。
接下來M行每行兩個整數u,v,代表存在一條里連接 u,v的無向邊。可能存在重邊自環。

Output

降序輸出所有不為0的F(i) 。保留6位小數輸出。

Sample Input

輸入1:

5 5
1 2
2 5
3 4
4 5
3 5

輸入2:

5 4
1 2
2 5
5 4
4 3

Sample Output

輸出1:

3.000000
2.000000

輸出2:

2.800000
2.200000

Data Constraint

對于20%的數據,n,m<=100
對于40%的數據,n,m<=5000
另外有20%的數據,保證圖為一個連通的簡單環,且當且僅當|u-v|=1 ,存在u到v的邊。
對于100%的數據,n,m<=500000

Solution

  • 我們可以愉快的發現這種染色很快就會進入一個循環……

  • 聽說可以證明循環的次數,可是我不會,就只做個十幾二十輪。

  • 用哈希判斷一下當前狀態出現過沒,出現了就說明出現了循環節!

  • 由于 F 數組的是通過取極限得到的,我們只需要保存循環節的答案即可。

  • 統計循環節的答案時要打一下標記就能均攤 O(1) 計算了。

  • 要注意一下精度問題~~。

Code

#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> using namespace std; const int N=500001,mo=1e9+7,M=1e6+1; int n,m,tot,sum,pos; int first[N],next[N<<1],en[N<<1]; int a[N],p[M]; long long h[M],b[N],c[N],g[17][N],ans[N]; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } inline void insert(int x,int y) {next[++tot]=first[x];first[x]=tot;en[tot]=y; } inline int hash(int x) {int y=x%M;while(h[y] && h[y]^x) y=(y+1)%M;return y; } int main() {n=read(),m=read();for(int i=1;i<=m;i++){int x=read(),y=read();insert(x,y);insert(y,x);}for(int i=1;i<=n;i++) a[i]=i;for(int j=1,k=1;j<=n*16;j++,k=k+1>n?1:k+1){for(int i=first[k];i;i=next[i]){c[a[en[i]]]+=k-b[en[i]];b[en[i]]=k;a[en[i]]=a[k];}//for(int i=1;i<=n;i++) c[a[i]]++;if(k==n){for(int i=1;i<=n;i++) c[a[i]]+=k-b[i];memset(b,0,sizeof(b));long long key=0;for(int i=1;i<=n;i++) key=(key*10+a[i])%mo;int k=hash(key);if(h[k]){pos=p[k];break;}else{h[k]=key,p[k]=++sum;memcpy(g[sum],c,sizeof(g[sum]));}}}for(int i=1;i<=n;i++) b[i]=c[i]-g[pos][i];tot=0;double num=1.0/(1.0*n*(sum-pos+1)),ext=1e-6;for(int i=1;i<=n;i++)if(b[i]>=ext) ans[++tot]=b[i];sort(ans+1,ans+1+tot);for(int i=tot;i;i--) printf("%.6lf\n",1.0*ans[i]*num);return 0; }

總結

以上是生活随笔為你收集整理的JZOJ 5490. 【清华集训2017模拟11.28】图染色的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。