演算法模板(五)樹基礎演算法
阿新 • • 發佈:2018-11-08
最小生成樹
#include<bits/stdc++.h> #define maxn 5000 #define maxm 10000 using namespace std; inline char get(){ static char buf[30],*p1=buf,*p2=buf; return p1==p2 && (p2=(p1=buf)+fread(buf,1,30,stdin),p1==p2)?EOF:*p1++; } inline int read(){ register char c=get();register int f=1,_=0; while(c>'9' || c<'0')f=(c=='-')?-1:1,c=get(); while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=get(); return _*f; } struct edge{ int u,int v,int w,int next; }E[maxm<<1]; bool cmp(edge a,edge b){ return a.w<b.w; } int p[maxn],eid; inline void init(){ for(register int i=0;i<maxn;i++)p[i]=-1; eid=0; } int get(int x){ if(fa[x]==x)return x; return fa[x]=get(fa[x]); } inline void insert(int u,int v,int w){ E[eid].u=u; E[eid].v=v; E[eid].w=w; E[eid].next=p[u]; p[u]=eid++; } inline void insert2(int u,int v,int w){ insert(u,v,w); insert(v,u,w); } inline int kru(int n,int m){ int sum=0; for(register int i=0;i<=n;i++)fa[i]=i; sort(E,E+m,cmp); for(register int i=0;i<m;i++){ int u=get(E[i].u); int v=get(E[i].v); if(u!=v){ fa[v]=u; sum+=E[i].w; } } } int main(){ n=read();m=read(); for(register int i=0;i<m;i++)E[i].u=read(),E[i].v=read(),E[i].w=read(); cout<<kru(n,m); return 0; }
求樹的直徑
#include<bits/stdc++.h> #define maxn 2000 #define maxm 2000 using namespace std; struct edge{ int u,v,w,next; }; int p[maxn],eid; inline void init(){ for(register int i=0;i<maxn;i++)p[i]=-1; eid=0; } inline void insert(int u,int v,int w){ E[eid].u=u; E[eid].v=v; E[eid].w=w; E[eid].next=p[u]; p[u]=eid++; } inline void insert2(int u,int v,int w){ insert(u,v,w); insert(v,u,w); } int maxlen,point; void dfs(int u,int pre,int step){ if(maxlen!=step){ maxlen=step; point=u; } for(register int i=p[u];~i;i=E[i].next){ if(E[i].v!=pre){ dfs(E[i].v,u,step+1); } } } int diamonted(){ maxlen=-1; diameter(1,0,0); maxlen=-1; diameter(point,0,0); } int n,m; int main(){ cin>>n>>m; int u,v,w; for(register int i=0;i<m;i++){ cin>>u>>v>>w; insert2(u,v,w); } cout<<diameter(); }