树的直径和并查集判环

来源:互联网 发布:阿里云ubuntu中文乱码 编辑:程序博客网 时间:2024/05/29 10:24
#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#include<queue>#define maxn 2000001#define maxe 100001using namespace std;int n,m;int first[maxe],nxt[maxn],to[maxn],e,cost[maxn];int fa[maxe];void add(int u,int v,int c){     to[e]=v;cost[e]=c;nxt[e]=first[u];first[u]=e++;}int finds(int x){     if(fa[x]==x)return fa[x];     else return fa[x]=finds(fa[x]);}void unit(int a,int b){     int x=finds(a);     int y=finds(b);     if(x==y)return ;     else fa[x]=y;     return ;}int d[maxe];int bfs(int s){    memset(d,-1,sizeof d);    queue<int>q;    q.push(s);    d[s]=0;    while(!q.empty()){        int u=q.front();        q.pop();        for(int i=first[u];~i;i=nxt[i]){            int v=to[i];            if(d[v]==-1){                d[v]=d[u]+cost[i];                q.push(v);            }        }    }    int id=-1;    for(int i=1;i<=n;i++){        if(id==-1||d[i]>d[id])id=i;    }    return id;}int maxlen(int s){  int a=bfs(s);  int b=bfs(a);  return d[b];}int main(){    int u,v,c;    freopen("in.txt","r",stdin);    while(scanf("%d%d",&n,&m)!=EOF){        bool flag=false;        e=0;        memset(first,-1,sizeof first);        for(int i=1;i<=n;i++)            fa[i]=i;        for(int i=0;i<m;i++){            scanf("%d%d%d",&u,&v,&c);            add(u,v,c);            add(v,u,c);            if(finds(u)==finds(v))flag=true;            unit(u,v);        }        if(flag)puts("YES");        else{            printf("%d\n",maxlen(1));        }    }}



湫湫系列故事——设计风景线

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 3218    Accepted Submission(s): 578


Problem Description
  随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好。
  现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度。请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?
  其中,可以兴建的路线均是双向的,他们之间的长度均大于0。
 

Input
  测试数据有多组,每组测试数据的第一行有两个数字n, m,其含义参见题目描述;
  接下去m行,每行3个数字u v w,分别代表这条线路的起点,终点和长度。

  [Technical Specification]
  1. n<=100000
  2. m <= 1000000
  3. 1<= u, v <= n
  4. w <= 1000
 

Output
  对于每组测试数据,如果能够建成环形(并不需要连接上去全部的风景点),那么输出YES,否则输出最长的长度,每组数据输出一行。
 

Sample Input
3 31 2 12 3 13 1 1
 

Sample Output
YES

0 0
原创粉丝点击