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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu6832(2020hdu多校6t6)

發(fā)布時(shí)間:2023/12/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu6832(2020hdu多校6t6) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題解

所有最短路肯定都出現(xiàn)在最小生成樹上。因?yàn)榭唆斔箍柊错樞蜻B邊,前面已經(jīng)連上的肯定最優(yōu),所有加起來比當(dāng)前的還小。
這個(gè)我感覺求單源多匯最短路后的剩余圖其實(shí)和最小生成樹其實(shí)是一樣的。因?yàn)槿绻钚∩蓸涞慕Y(jié)論是對(duì)的,那么源點(diǎn)到所有點(diǎn)的最短路一定都在樹上,剩余圖就是這個(gè)最小生成樹。我試了試都是可以AC的。
開始初始化錯(cuò)了,少初始化了一堆東西,dfs停不下來,MLE。后來wa,因?yàn)槊杜e邊端點(diǎn)dp計(jì)數(shù)沒想清。

AC代碼

  • dij版本(跑的較慢)
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> #include<iostream> #include<queue> using namespace std; const int modd=1e9+7; const int oo=1e9+10; const int NN=100100; const int MM=200100; int n,m; int vis[NN],dis[NN]; struct edge{int to,cost,from; }e[MM*2]; vector <int> con[NN]; int a[NN]; struct point{int id;long long d; }; struct point_cmp{bool operator() (const point &x,const point &y)const{if(x.d>y.d)return 1;if(x.d==y.d && x.id>y.id)return 1;return 0;} }; priority_queue <point ,vector<point> , point_cmp > q; int pre[NN]; void dij(int origin){for(int i=0;i<=n+1;i++)dis[i]=oo;dis[origin]=0;point st;st.id=origin;st.d=0;q.push(st);while(!q.empty()){point root=q.top();q.pop();if(dis[root.id]!=root.d)continue;for(int i=0;i<con[root.id].size();i++){edge ed=e[con[root.id][i]];int nex=ed.to;if(dis[nex]>max(dis[root.id],ed.cost) ){pre[nex]=con[root.id][i];dis[nex]=max(dis[root.id],ed.cost);point neww;neww.id=nex;neww.d=dis[nex];q.push(neww);}}} } long long siz[NN],sizfa[NN],numson1[NN],numfa1[NN],num1; int f[MM]; void dfs(int cur,int fa){int up=con[cur].size();numson1[cur]=(a[cur]==1);siz[cur]=1;for(int i=0;i<up;i++){edge ed=e[con[cur][i]];int nex=ed.to;if(f[con[cur][i]]&&nex!=fa){dfs(nex,cur);siz[cur]+=siz[nex];numson1[cur]+=numson1[nex];}} } long long ans=0; long long quan[MM]; void dfsfa(int cur,int fa,int co){int up=con[cur].size();numfa1[cur]=num1-numson1[cur];sizfa[cur]=n-siz[cur];if(cur!=1){ans+=quan[co]*(1ll*numfa1[cur]*(siz[cur]-numson1[cur])%modd+1ll*(sizfa[cur]-numfa1[cur])*numson1[cur]%modd )%modd;ans%=modd;}for(int i=0;i<up;i++){edge ed=e[con[cur][i]];int nex=ed.to;if(f[con[cur][i]]&&nex!=fa){dfsfa(nex,cur,ed.cost);}} } int fa[NN]; int getf(int x){if(fa[x]==x)return x;return (fa[x]=getf(fa[x])); } int main(){//freopen("1.in","r",stdin);quan[0]=1;for(int i=1;i<=200000;i++){quan[i]=(quan[i-1]<<1)%modd;}int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);if(n==0)break;for(int i=1;i<=n;i++)con[i].clear(),fa[i]=i;for(int i=0;i<=m*2;i++)f[i]=0;num1=0;for(int i=1;i<=n;i++){scanf("%d",a+i);num1+=(a[i]==1);}int nume=-1;for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);e[++nume].to=y;e[nume].cost=i;e[nume].from=x;con[x].push_back(nume);e[++nume].to=x;e[nume].cost=i;e[nume].from=y;con[y].push_back(nume);}dij(1);for(int i=1;i<=n;i++){// int fx=getf(e[i].from);// int fy=getf(e[i].to);// if(fx!=fy){f[pre[i]]=1;f[pre[i]^1]=1;//printf("%d %d\n",fx,fy);// fa[fx]=fy;// f[i]=1;// f[i^1]=1;// }}dfs(1,-1);ans=0;dfsfa(1,-1,0);// printf("*%lld %lld %lld\n",sizfa[1],sizfa[2],sizfa[3]);// long long ans=0;// for(int i=0;i<=nume;i++){// if(f[i]){// int fr=e[i].from;// int to=e[i].to;// int co=e[i].cost;// printf("%lld %lld %lld\n",quan[co],numfa1[fr],sizfa[fr]);// ans=ans+quan[co]*// (numfa1[fr]*(siz[to]-numson1[to])%modd+(sizfa[fr]-numfa1[fr])*numson1[to]%modd )%modd;// ans%=modd;// }// }printf("%lld\n",ans);}return 0; } /* 6 9 1 1 0 1 0 1 5 2 5 4 2 1 2 6 2 3 5 3 2 4 4 1 3 4 */
  • 克魯斯卡爾版
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> #include<iostream> #include<queue> using namespace std; const int modd=1e9+7; const int oo=1e9+10; const int NN=100100; const int MM=200100; int n,m; //int vis[NN],dis[NN]; struct edge{int to,cost,from; }e[MM*2]; vector <int> con[NN]; int a[NN]; // struct point{ // int id; // long long d; // }; // struct point_cmp{ // bool operator() (const point &x,const point &y)const{ // if(x.d>y.d)return 1; // if(x.d==y.d && x.id>y.id)return 1; // return 0; // } // }; // priority_queue <point ,vector<point> , point_cmp > q; // int pre[NN]; // void dij(int origin){ // for(int i=0;i<=n+1;i++)dis[i]=oo; // dis[origin]=0; // point st; // st.id=origin;st.d=0; // q.push(st); // while(!q.empty()){ // point root=q.top(); // q.pop(); // if(dis[root.id]!=root.d)continue; // for(int i=0;i<con[root.id].size();i++){ // edge ed=e[con[root.id][i]]; // int nex=ed.to; // if(dis[nex]>max(dis[root.id],ed.cost) ){ // pre[nex]=con[root.id][i]; // dis[nex]=max(dis[root.id],ed.cost); // point neww; // neww.id=nex;neww.d=dis[nex]; // q.push(neww); // } // } // } // } long long siz[NN],sizfa[NN],numson1[NN],numfa1[NN],num1; int f[MM]; void dfs(int cur,int fa){int up=con[cur].size();numson1[cur]=(a[cur]==1);siz[cur]=1;for(int i=0;i<up;i++){edge ed=e[con[cur][i]];int nex=ed.to;if(f[con[cur][i]]&&nex!=fa){dfs(nex,cur);siz[cur]+=siz[nex];numson1[cur]+=numson1[nex];}} } long long ans=0; long long quan[MM]; void dfsfa(int cur,int fa,int co){int up=con[cur].size();numfa1[cur]=num1-numson1[cur];sizfa[cur]=n-siz[cur];if(cur!=1){ans+=quan[co]*(1ll*numfa1[cur]*(siz[cur]-numson1[cur])%modd+1ll*(sizfa[cur]-numfa1[cur])*numson1[cur]%modd )%modd;ans%=modd;}for(int i=0;i<up;i++){edge ed=e[con[cur][i]];int nex=ed.to;if(f[con[cur][i]]&&nex!=fa){dfsfa(nex,cur,ed.cost);}} } int fa[NN]; int getf(int x){if(fa[x]==x)return x;return (fa[x]=getf(fa[x])); } int main(){//freopen("1.in","r",stdin);quan[0]=1;for(int i=1;i<=200000;i++){quan[i]=(quan[i-1]<<1)%modd;}int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);if(n==0)break;for(int i=1;i<=n;i++)con[i].clear(),fa[i]=i;for(int i=0;i<=m*2;i++)f[i]=0;num1=0;for(int i=1;i<=n;i++){scanf("%d",a+i);num1+=(a[i]==1);}int nume=-1;for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);e[++nume].to=y;e[nume].cost=i;e[nume].from=x;con[x].push_back(nume);e[++nume].to=x;e[nume].cost=i;e[nume].from=y;con[y].push_back(nume);}//dij(1);for(int i=0;i<=nume;i+=2){int fx=getf(e[i].from);int fy=getf(e[i].to);if(fx!=fy){//f[pre[i]]=1;//f[pre[i]^1]=1;//printf("%d %d\n",fx,fy);fa[fx]=fy;f[i]=1;f[i^1]=1;}}dfs(1,-1);ans=0;dfsfa(1,-1,0);// printf("*%lld %lld %lld\n",sizfa[1],sizfa[2],sizfa[3]);// long long ans=0;// for(int i=0;i<=nume;i++){// if(f[i]){// int fr=e[i].from;// int to=e[i].to;// int co=e[i].cost;// printf("%lld %lld %lld\n",quan[co],numfa1[fr],sizfa[fr]);// ans=ans+quan[co]*// (numfa1[fr]*(siz[to]-numson1[to])%modd+(sizfa[fr]-numfa1[fr])*numson1[to]%modd )%modd;// ans%=modd;// }// }printf("%lld\n",ans);}return 0; } /* 6 9 1 1 0 1 0 1 5 2 5 4 2 1 2 6 2 3 5 3 2 4 4 1 3 4 */

總結(jié)

以上是生活随笔為你收集整理的hdu6832(2020hdu多校6t6)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。