敲了三种模板,等做了训练题再回来补充
两次dfs
#include <cmath>
#include <queue>
#include <string>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define forn(i, n) for (int i = 0; i < (n); i++)
#define forab(i, a, b) for (int i = (a); i <= (b); i++)
#define forba(i, b, a) for (int i = (b); i >= (a); i--)
#define mset(a, n) memset(a, n, sizeof(a))
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define P pair<int,int>
#define fi first
#define se second
using namespace std;
#define N 1000010
#define maxn 1005
#define inf 0x3f3f3f3f
#define ll long long
int head[N], ver[N], edge[N], Next[N], d[N];
int n, m, tot;
int start, endd;
bool vis[N];
void addedge(int x,int y,int z)
{
ver[++tot] = y;
edge[tot] = z;
Next[tot] = head[x];
head[x] = tot;
}
void dfs(int x)
{
vis[x] = 1;
for (int i = head[x]; i;i=Next[i])
{
int y = ver[i];
int z = edge[i];
if(!vis[y])
{
d[y] = d[x] + z;
dfs(y);
}
}
}
int main()
{
fast;
cin >> n >> m;
forab(i,1,m)
{
int x, y, z;
cin >> x >> y >> z;
addedge(x, y, z);
addedge(y, x, z);
}
mset(vis, 0);
mset(d, 0x3f);
d[1] = 0;
dfs(1);
int maxx = -inf;
forab(i,1,n)
{
if(d[i]>maxx&&d[i]!=inf)
{
maxx = d[i];
start = i;
}
}
mset(vis, 0);
mset(d, 0x3f);
d[start] = 0;
dfs(start);
maxx = -inf;
forab(i,1,n)
{
if(d[i]>maxx&&d[i]!=inf)
{
maxx = d[i];
endd = i;
}
}
cout << start << " " << endd << endl;
cout << maxx << endl;
system("pause");
}
/*
6 5
1 2 3
2 3 2
3 4 1
2 5 7
5 6 1
*/
两次bfs
#include <cmath>
#include <queue>
#include <string>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define forn(i, n) for (int i = 0; i < (n); i++)
#define forab(i, a, b) for (int i = (a); i <= (b); i++)
#define forba(i, b, a) for (int i = (b); i >= (a); i--)
#define mset(a, n) memset(a, n, sizeof(a))
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define P pair<int,int>
#define fi first
#define se second
using namespace std;
#define N 1000010
#define maxn 1005
#define inf 0x3f3f3f3f
#define ll long long
int head[N], ver[N], edge[N], Next[N], d[N];
int n, m, tot;
bool vis[N];
void addedge(int x,int y,int z)
{
ver[++tot] = y;
edge[tot] = z;
Next[tot] = head[x];
head[x] = tot;
}
void bfs(int s)
{
mset(d, 0x3f);
mset(vis, 0);
queue<int> q;
d[s] = 0;
vis[s] = 1;
q.push(s);
while(q.size())
{
int x = q.front();
q.pop();
for (int i = head[x]; i;i=Next[i])
{
int y = ver[i];
int z = edge[i];
if(!vis[y])
{
d[y] = d[x] + z;
vis[y] = 1;
q.push(y);
}
}
}
}
int main()
{
fast;
cin >> n >> m;
forab(i,1,m)
{
int x, y, z;
cin >> x >> y >> z;
addedge(x, y, z);
addedge(y, x, z);
}
bfs(1);
int start, endd;
int Maxx = -inf;
forab(i,1,n)
{
if(d[i]>Maxx&&d[i]!=inf)
{
Maxx = d[i];
start = i;
}
}
bfs(start);
Maxx = -inf;
forab(i,1,n)
{
if(d[i]>Maxx&&d[i]!=inf)
{
Maxx = d[i];
endd = i;
}
}
cout << start << " " << endd << endl;
cout << Maxx << endl;
system("pause");
}
/*
6 5
1 2 3
2 3 2
3 4 1
2 5 7
5 6 1
*/
树形DP
#include <cmath>
#include <queue>
#include <string>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define forn(i, n) for (int i = 0; i < (n); i++)
#define forab(i, a, b) for (int i = (a); i <= (b); i++)
#define forba(i, b, a) for (int i = (b); i >= (a); i--)
#define mset(a, n) memset(a, n, sizeof(a))
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define P pair<int,int>
#define fi first
#define se second
using namespace std;
#define N 1000010
#define maxn 1005
#define inf 0x3f3f3f3f
#define ll long long
int head[N], ver[N], edge[N], Next[N], d[N];
int n, m, tot;
int start, endd;
bool vis[N];
int ans;
void addedge(int x,int y,int z)
{
ver[++tot] = y;
edge[tot] = z;
Next[tot] = head[x];
head[x] = tot;
}
void dp(int x) //根节点
{
vis[x] = 1;
for (int i = head[x]; i;i=Next[i])
{
int y = ver[i];
int z = edge[i];
if(vis[y])
continue;
dp(y);
ans = max(ans, d[x] + d[y] + z);
d[x] = max(d[x], d[y] + z);
}
}
int main()
{
fast;
int x, y, z;
n = 0;
while(cin>>x>>y>>z)
{
addedge(x, y, z);
addedge(y, x, z);
n = max(n, max(x, y));
}
dp(1);
cout << ans << endl;
system("pause");
}
/*
6 5
1 2 3
2 3 2
3 4 1
2 5 7
5 6 1
*/