Highway 湘潭邀请赛(江苏省赛)----树的直径
2017-05-16 20:18
447 查看
叉姐出的题,题目在ICPC camp里,是pdf,我就没有复制。
树的直径裸题,不会树的直径的建议去百度。
先求出树的直径的两个端点,然后把所有点往这两个端点上连就可以了。
补题在camp上
代码:
树的直径裸题,不会树的直径的建议去百度。
先求出树的直径的两个端点,然后把所有点往这两个端点上连就可以了。
补题在camp上
代码:
#include <cstdio> #include <iostream> #include <cstring> #include <queue> #define inf 0x3f3f3f3f #define LL long long using namespace std; const int maxn=100100; struct node{ int u,v,w; int pre; }edge[maxn<<1]; int nEdge,p[maxn]; LL dis[maxn]; LL DD[maxn]; bool vis[maxn]; void Init(){ memset(dis,0,sizeof(dis)); memset(p,-1,sizeof(p)); memset(vis,false,sizeof(vis)); nEdge=0; } void connect(int u,int v,int w){ edge[nEdge].u=u; edge[nEdge].w=w; edge[nEdge].v=v; edge[nEdge].pre=p[u]; p[u]=nEdge++; edge[nEdge].u=v; edge[nEdge].w=w; edge[nEdge].v=u; edge[nEdge].pre=p[v]; p[v]=nEdge++; } int bfs(int s){ queue<int >q; while(!q.empty()) q.pop(); vis[s]=true; q.push(s); LL maxx=0; int key=-1; while(!q.empty()){ int t=q.front(); //cout<<t<<endl; q.pop(); for(int i=p[t];~i;i=edge[i].pre){ int v=edge[i].v; if(!vis[v]&&dis[v]<dis[t]+edge[i].w){ vis[v]=true; dis[v]=dis[t]+edge[i].w; q.push(v); if(dis[v]>maxx){ maxx=dis[v]; key=v; } } } } return key; } void bfs1(int s){ queue<int >q; while(!q.empty()) q.pop(); vis[s]=true; q.push(s); while(!q.empty()){ int t=q.front(); q.pop(); for(int i=p[t];~i;i=edge[i].pre){ int v=edge[i].v; if(!vis[v]&&dis[v]<dis[t]+edge[i].w){ vis[v]=true; dis[v]=dis[t]+edge[i].w; DD[v]=max(DD[v],dis[v]); q.push(v); } } } } int main(){ int n; while(~scanf("%d",&n)){ Init(); memset(DD,0,sizeof(DD)); for(int i=0;i<n-1;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); connect(u,v,w); } //for(int i=1;i<=n;i++){ // printf("%d ",DD[i]); //} //cout<<endl; int a=bfs(1); memset(vis,false,sizeof(vis)); memset(dis,0,sizeof(dis)); int b=bfs(a); LL sum=dis[b]; //cout<<a<<" "<<b<<endl; memset(vis,false,sizeof(vis)); memset(dis,0,sizeof(dis)); bfs1(a); //cout<<"--------"<<endl; memset(vis,false,sizeof(vis)); memset(dis,0,sizeof(dis)); bfs1(b); //for(int i=1;i<=n;i++){ // printf("%d ",DD[i]); //} //cout<<endl; for(int i=1;i<=n;i++){ if(i==a||i==b) continue; sum+=DD[i]; } cout<<sum<<endl; } return 0; } /* 5 1 2 2 1 3 1 2 4 2 3 5 1 */
相关文章推荐
- ccpc湘潭邀请赛 h-highway(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 湘潭邀请赛 Highway 树的直径
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway XTOJ 1267 【树的直径】
- 2017 湘潭邀请赛 H Highway(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- ccpc湘潭邀请赛 h-highway(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)
- 2017ccpc全国邀请赛(湖南湘潭) H. Highway (最大生成树)(树的直径)