没有合适的资源?快使用搜索试试~ 我知道了~
首页ACM图论模板合集.pdf
ACM图论模板合集.pdf
需积分: 50 10 下载量 183 浏览量
更新于2023-03-03
评论 2
收藏 1.44MB PDF 举报
ACM算法模板的PDF版本,方便大家打印与使用,所有模板均经过测试。 最短路: SPFA模板 Dijkstra模板 Floyd模板 图论--最短路--第K短路(IDA*)(IDA Star)模板 传递闭包: 传递闭包 欧拉与哈密尔顿路径: 欧拉回路 图论--欧拉回路--弗罗莱算法模板 LCA: 图论--LCA--Tarjan(离线) 图论--LCA--树上倍增法(在线) 图论--LCA--在线RMQ ST 最小环: 图论--最小环--Floyd模板 树的直径: 图论--树的直径--DFS+树形DP模板 树的重心: 图论--树的重心(DFS) 模板 生成树: 图论--最小生成树--Kruscal 模板 图论--最短路径生成树(最小边权和)模板 图论--最短路径生成树计数--模板 图论--生成树--次小生成树模板 图论--曼哈顿距离最小生成树模板 图论--生成树计数模板 连通性: 图论--割点--Tarjan模板 图论--割边--Tarjan模板 图论--边双连通V-DCC缩点 图论--双连通E-DCC缩点模板 图论--强连通
资源详情
资源评论
资源推荐

ACM 图论模板
BY SDAU 张俊浩

SPFA
typedef long long ll;
typedef pair<int,int> PII;
struct Node
{
int to, lat, val; //边的右端点,边下一条边,边权
};
Node edge[1000005];
int head[1005],tot,dis[1005],N,M,vis[1005];
void add(int from, int to, int dis)
{
edge[++tot].lat = head[from];
edge[tot].to = to;
edge[tot].val = dis;
head[from] = tot;
}
void spfa(int s)
{
memset(dis, 0x3f, sizeof(dis));
dis[0]=0;
memset(vis, 0, sizeof(vis));
vis[s] = 1;
dis[s] = 0;
queue<int>Q;
Q.push(s);
while (!Q.empty()) {
int u = Q.front();
Q.pop();
vis[u] = 0;
for (int i = head[u];i;i = edge[i].lat) {
int to = edge[i].to;
int di = edge[i].val;
if (dis[to]>dis[u] + di) {
dis[to] = dis[u] + di;
if (!vis[to]) {
vis[to] = 1;
Q.push(to);
}
}
}
}
}
int main()
{
int t, x;
scanf("%d", &t);
while (t--)
{
memset(head, 0, sizeof(head));
cini(N),cini(M);
while (M--)
{
int a, b, dis;
scanf("%d %d %d", &a, &b, &dis);
add(a, b, dis),add(b,a,dis);
}
cini(x);
spfa(x);
}
return 0;
}
Dijkstra
typedef long long ll;
typedef pair<int,int> PII;
struct Node
{
int var,next,val;
} edge[100000005];
int head[100005],tot,dis[100005],N,M;
bool vis[100005];

priority_queue<PII> Q;
void add(int a, int b, int c)
{
edge[++tot].var = b;
edge[tot].val = c;
edge[tot].next = head[a];
head[a] = tot;
}
void init()//多组输入调用
{
tot=0;
memset(head,0,sizeof(head));
}
void dijkstra(int s)
{
memset(dis,0x3f,sizeof(dis));
//memset(vis,0,sizeof(vis));
//while(Q.size()) Q.pop();
dis[s] = 0;
Q.push(make_pair(0,s));
while(!Q.empty())
{
int x=Q.top().second;
Q.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=head[x]; i; i=edge[i].next)
{
int y=edge[i].var;
if(dis[x]+edge[i].val<dis[y])
{
dis[y]=dis[x]+edge[i].val;
if(!vis[y])
Q.push(make_pair(-dis[y],y));
}
}
}
}
int main()
{
int S;
scanf("%d %d %d",&N,&M,&S);
while(M--)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
}
dijkstra(S);
for(int i=1; i<=N; i++)printf("%d ",dis[i]);
}
Floyd
#define INF 0x3f3f3f3f
#define maxn 1005
int D[maxn][maxn];
int P[maxn][maxn];
int N,M; //顶点数边数
int S,E; //起点终点
void Floyd()
{
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
if(D[i][j]>D[i][k]+D[k][j])
{
D[i][j]=D[i][k]+D[k][j];
P[i][j]=P[k][j];
}
}

}
int main()
{
//init
memset(D,0x3f,sizeof(D));
memset(P,0x3f,sizeof(P));
//录入图
cin>>N>>M;
for(int i=1;i<=M;i++)
{
int u,v,cost;
cin>>u>>v>>cost;
if(cost<D[u][v]) //D 的初始化为边的信息
{
D[u][v]=cost;
//D[v][u]=cost;//无向图
}
}
for(int i=1;i<=N;i++) //初始化 P
for(int j=1;j<=N;j++)
{
if(i!=j&&D[i][j]!=INF) //P 第 0 层为 i
P[i][j]=i;
}
cin>>S>>E;
//
Floyd();
//最短距离
cout<<D[S][E]<<endl;
//路径回溯
int temp=P[S][E];
cout<<E;
while(true)
{
if(temp==S)
{
cout<<"<--"<<S<<endl;
break;
}
cout<<"<-"<<P[S][temp];
temp=P[S][temp];
}
}
传递闭包
int dp[105][105],in[105],out[105];
int init()
{
for(int i=1;i<=105;i++)
{
in[i]=0;
out[i]=0;
for(int j=1;j<=100;j++)
{
dp[i][j]=0;
}
}
}
int main()
{
long long t;
cin>>t;
while(t--){
init();
long long n,m;
cin>>n>>m;
long long flag=0;
for(int i=1;i<=m;i++){
long long l,r;
cin>>l>>r;
dp[l][r]=1;
if(l==r) flag=1; //自己排在自己前面是不可能的,

直接按题意输出 0
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j]=(dp[i][k]&&dp[k][j]);//floyd 讨
论图的连通性
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dp[i][j]==1&&dp[j][i]==1)
flag=1;
//floyd 讨论图的连通性后,如果出现环的话,就是我排在
你前面。你排在我前面,同样不可能
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dp[i][j]==1){
in[i]++; //有几个人排在第 I 个人前面
out[j]++;//有几个人排在第 j 个人后面面
}
if(flag) //不符合现实的按题意输出 0{
for(int i=1;i<=n;i++)cout<<"0";
cout<<endl;
}
else{
for(int i=1;i<=n;i++)
{
if(in[i]>=(n+1)/2||out[i]>=(n+1)/2)
cout<<"0";
//如果在他前面或者在他后面的不等于一般的人数,他
绝对不是中间位置
else cout<<"1";
}
cout<<endl;
}
}
return 0;
}
欧拉回路
int g[510][510], d[510];
stack<int> s;
void euler(int u){
for(int v=1; v<=500; v++){
if(g[u][v]) {
g[u][v]--;
g[v][u]--;
euler(v);
s.push(v);
}
}
}
int main()
{
int u,v,n;
cin>>n>>m;// 点,边
for(int i=1; i<=m; i++) {
cin>>u>>v;
g[u][v]++;
g[v][u]++;
d[u]++;
d[v]++;
}
int flag=1;
int cnt=0;
for(int i=n; i>=1; i--)
if(d[i]%2) {
flag=i;
cnt++;
}
if(cnt>2){
cout<<"No Euler"<<endl;
return 0;
剩余41页未读,继续阅读


















风骨散人Chiam
- 粉丝: 3w+
- 资源: 9
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- 分布式高并发.pdf
- 毕业论文java vue springboot mysql 4S店车辆管理系统.docx
- 计算机应用基础Excel题库--.doc
- 毕业论文springboot297毕业生实习与就业管理系统的设计与实现论文.doc
- Oracle 自动诊断资料档案库(ADR) 说明
- 本科毕业论文---单片机的人体脉搏指示仪.doc
- 本科毕业论文---基于matlab的倒立摆pid控制系统设计(论文)设计.doc
- 护理PDCA循环案例汇报PPT模板
- 基于STM32CubeIDE的LittleVGL的开发环境搭建
- 豫锦程室内设计网站建设与运营网上项目策划书.doc
- 《数据挖掘与大数据分析》分类与聚类实验报告
- 毕业论文ssm556班级事务管理系统+vue论文.doc
- 采购与库存管理控制策略与软件设计毕业论文.doc
- WScript常用对象及方法简介-批处理讲座
- 非标准化旅游产品预订系统的实现方法研究-计算机科学与技术等专业--学位论文.doc
- 高压电机叠频试验方法及数据采集的研究.doc
- datastage问题处理大全
- 基于python知识图谱的百科知识问答平台源码数据库论文.docx
- 基于python框架的课堂投票系统源码数据库论文.docx
- 第十一章-GIS组件开发-PPT课件.ppt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0