21
代码仓库
最小生成树(prim),hdu1102
#include
int prim(){
int minw[N];//MinWeight bool used[N];
memset(used,0,sizeof(used)); memset(minw,0x7f,sizeof(minw)); minw[1]=0; int sum=0; while(1){ int v=-1;
for(int i=1;i<=n;i++){
if(!used[i]&&(v==-1||minw[i] if(v==-1)break; used[v]=1; sum+=minw[v]; for(int i=0;i<=n;i++){ minw[i]=min(minw[i],g[v][i]); } } return sum; } 22 代码仓库 int main(){ for(;scanf(\,&n)==1;){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)scanf(\,&g[i][j]); int x,y,q; scanf(\,&q); for(;q--;){ scanf(\,&x,&y); g[x][y]=g[y][x]=0; } printf(\,prim()); } return0; } 次小生成树hdu4081 //hdu4081 次小生成树 #include 代码仓库 }citys[N]; double dist(City a,City b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double prim(){ int from[N]; bool vis[N]; double minw[N]; for(int i=1;i<=n;i++){ minw[i]=g[1][i]; from[i]=1; } memset(used,0,sizeof(used)); memset(maxw,0,sizeof(maxw)); memset(vis,0,sizeof(vis)); vis[1]=1; minw[1]=0; double sum=0; while(1){ int v=-1; for(int i=1;i<=n;i++)if(!vis[i]){ if(v==-1||minw[i] if(v==-1)break; used[v][from[v]]=used[from[v]][v]=1; vis[v]=1; sum+=minw[v]; for(int i=1;i<=n;i++){ if(!vis[i]&&g[v][i] if(vis[i]&&i!=v){ maxw[i][v]=maxw[v][i]=max(maxw[i][from[v]],minw[v]); } } } return sum; } int main(){ 24 代码仓库 //freopen(\int T;scanf(\,&T); for(;T--;){ scanf(\,&n);int x,y,z; for(int i=1;i<=n;i++){ scanf(\,&x,&y,&z); citys[i]=City(x,y,z); } for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) g[i][j]=dist(citys[i],citys[j]); double sum=prim(),ans=-1; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ if(used[i][j])ans=max(ans,(citys[i].w+citys[j].w)/(sum-g[i][j])); else ans=max(ans,(citys[i].w+citys[j].w)/(sum-maxw[i][j])); } } printf(\,ans); } return0; } 最大流(Dinic) #include 代码仓库 int n,m,a[N],b[N],ans[N][N]; struct gragh{ struct Edge{ int from,to,cap,flow; Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){} }; int s,t;//0=s,1~nАn+1~n+mPn+m+1=t vector int d[N],cur[N];//dist,now edge,use in dfs inlinevoid AddEdge(int from,int to,int cap){ edges.push_back(Edge(from,to,cap,0)); edges.push_back(Edge(to,from,0,0)); int top=edges.size(); G[from].push_back(top-2); G[ to ].push_back(top-1); } inlinebool BFS(){ memset(vis,0,sizeof(vis)); queue Q.push(s);d[s]=0;vis[s]=1; while(!Q.empty()){ int x=Q.front();Q.pop(); for(int i=0;i return vis[t]; } inlineint DFS(constint& x,int a){ //printf(\if(x==t||a==0){return a;} int flow =0, f; for(int& i=cur[x];i
代码仓库



