专栏文章

图基础模版

算法·理论参与者 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。
pAwNWCV.png

评论

0 条评论,欢迎与作者交流。

正在加载评论...