专栏文章
图基础模版
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minkvlws
- 此快照首次捕获于
- 2025/12/02 04:04 3 个月前
- 此快照最后确认于
- 2025/12/02 04:04 3 个月前
图存储
链式前向星
核心思想
通过链表存储边
代码
CPP#include<bits/stdc++.h>
using namespace std;
long long n,m,k;
struct abc
{
long long to,size,next;
}a[100005];
long long head[100005],cnt;
void add(long long x,long long y,long long z)
{
cnt++;
a[cnt].to=y;
a[cnt].next=head[x];
a[cnt].size=z;
head[x]=cnt;
return ;
}
//链式前向星核心
int main()
{
cin>>n>>m>>k;
//k为1则是有向图
//k为0则是无向图
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
if(k!=1)
{
add(y,x,z);
}
}
for(int i=1;i<=n;i++)
{
for(int j=head[i];j!=0;j=a[j].next)
{
cout<<i<<" "<<a[j].to<<" "<<a[j].size<<endl;
}
//链式前向星遍历
/*
作用:
找出以i为头的边(有向图)
/
找出连接i的所有边(无向图)
*/
}
return 0;
}
图直径
核心思想
- 直径两端点必为叶子节点
- 任意点的最远点必为直径端点
- 直径中点即为树的中心
代码
CPP#include<iostream>
using namespace std;
long long n;
struct abc
{
long long to,size,next;
}a[100005];
long long head[100005],cnt;
void add(long long x,long long y,long long z)
{
cnt++;
a[cnt].to=y;
a[cnt].next=head[x];
a[cnt].size=z;
head[x]=cnt;
return ;
}//链式前向星,见上文
long long fa /*farthest*/,lo /*longest*/;
void find(long long now,long long father,long long dep)
{
if(dep>lo)
{
lo=dep;
fa=now;
}
for(int i=head[now];i!=0;i=a[i].next)
{
if(a[i].to!=father)
{
find(a[i].to,now,dep+a[i].size);
}
}
}
long long get()
{
find(1,-1,0);
long long t=fa;
lo=0;
find(t,-1,0);
return lo;
}
//树直径核心
int main()
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
long long x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
cout<<get();
return 0;
}
警告
本段代码用万能头会ce。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...
