题目链接:传送门
题意:
先判一个图是否存在换,不存在的话输出这个图的最长路径。
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 1e6+10;
int par[maxn/10],head[maxn/10];
bool vis[maxn/10];
int dis[maxn/10];
bool used[maxn/10];
struct nod {
int to,next,w;
} edge[maxn*2];
int n,m,ip;
void init() {
ip=0;
memset(head,-1,sizeof(head));
memset(used,0,sizeof(used));
for(int i=1; i<maxn/10; i++)
par[i]=i;
}
int find_par(int x) {
if(par[x]!=x) return par[x] = find_par(par[x]);
return par[x];
}
bool Union(int x,int y) {
x=par[x];
y=par[y];
if(x!=y) {
par[y]=x;
return true;
}
return false;
}
void add(int u,int v,int w) {
edge[ip].to=v;
edge[ip].w=w;
edge[ip].next=head[u];
head[u]=ip++;
}
int max_size;
int BFS(int u) {
max_size=0;
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int >Q;
Q.push(u);
vis[u]=1;
int to =u;
while(!Q.empty()) {
int top = Q.front();
used[top]=1;
Q.pop();
for(int i=head[top]; i!=-1; i=edge[i].next) {
int v = edge[i].to;
if(!vis[v]) {
dis[v]=edge[i].w+dis[top];
if(dis[v]>max_size)
max_size=dis[v],to=v;
vis[v]=1;
Q.push(v);
}
}
}
return to;
}
int main() {
while(~scanf("%d%d",&n,&m)) {
init();
bool tag = 0;
for(int i=0; i<m; i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(tag) continue;
if(!Union(u,v)) tag = 1;
add(u,v,w);
add(v,u,w);
}
if(tag) {
puts("YES");
continue;
}
int ans = -1;
for(int i=1; i<=n; i++) {
if(!used[i]) {
int st = BFS(i);
BFS(st);
ans = max(ans,max_size);
}
}
printf("%d\n",ans);
}
return 0;
}
/****
5 4
1 2 1
2 3 2
2 4 1
4 5 2
***/