一起开心2020暑假训练第二周 图论(模板题)

比赛链接:

文章目录

    • A HDU 1285 一
    • B HDU 1863 起
    • C POJ 2387 开
    • D POJ 1502 心
    • E HDU 5922 图
    • F HDU 2112 论

A HDU 1285 一

拓扑排序模板题,记录每个点的入度,然后按照入度大小以及顺序进行输出

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
bool map[517][517];
int in[517];
priority_queue<int,vector<int>,greater<int> > q;
void topo(int n)
{for(int i=1;i<=n;i++){if(in[i]==0)q.push(i);}int c=1;while(!q.empty()){int v=q.top();q.pop();if(c!=n){cout<<v<<" ";c++;}elsecout<<v<<endl;for(int i=1;i<=n;i++){if(!map[v][i])continue;in[i]--;if(!in[i])q.push(i);}}
}
int main()
{int n,m,i,j;while(cin>>n>>m){int k=0;memset(map,0,sizeof map);memset(in,0,sizeof in);while(m--){cin>>i>>j;if(map[i][j])continue;map[i][j]=1;in[j]++;}topo(n);}
}

B HDU 1863 起

最小生成树模板题

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1e6+32;
struct node{int u,v,w;
}edge[maxn];
int fa[maxn];
int total=0;
bool cmp(node x,node y)
{return x.w<y.w;
}
int sum=0;
int find(int x)
{if(fa[x]==x)return x;else return find(fa[x]);
}
inline void Kruskal()
{total=0;sum=0;for(int i=1;i<=m;i++){int u=find(edge[i].u);int v=find(edge[i].v);if(u==v)continue;sum+=edge[i].w;fa[u]=v;total++;if(total==n-1)break;}} 
int main()
{while(cin>>m>>n){if(m==0)break;for(int i=1;i<=n;i++)fa[i]=i;memset(edge,0,sizeof(edge));for(int i=1;i<=m;i++){cin>>edge[i].u>>edge[i].v>>edge[i].w;}sort(edge+1,edge+1+m,cmp);Kruskal();if(total==n-1)cout<<sum<<endl;else cout<<"?"<<endl;}return 0;
}

C POJ 2387 开

最短路模板,从n 到 1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
const long long inf=2147483647;
const int maxn=10005;
const int maxm=500005;
using namespace std;
int n,m,s,num_edge=0;
int dis[maxn],vis[maxn],head[maxm];
struct Edge
{int next,to,dis;
}edge[maxm]; //结构体表示静态邻接表
void addedge(int from,int to,int dis) //邻接表建图
{ //以下是数据结构书上的标准代码,不懂翻书看解释edge[++num_edge].next=head[from]; //链式存储下一条出边edge[num_edge].to=to; //当前节点编号edge[num_edge].dis=dis; //本条边的距离head[from]=num_edge; //记录下一次的出边情况
}
void spfa()
{queue<int> q; //spfa用队列,这里用了STL的标准队列for(int i=1; i<=n; i++) {dis[i]=inf; //带权图初始化vis[i]=0; //记录点i是否在队列中,同dijkstra算法中的visited数组}q.push(s); dis[s]=0; vis[s]=1; //第一个顶点入队,进行标记while(!q.empty()){int u=q.front(); //取出队首q.pop(); vis[u]=0; //出队标记for(int i=head[u]; i; i=edge[i].next) //邻接表遍历,不多解释了(也可用vector代替){int v=edge[i].to; if(dis[v]>dis[u]+edge[i].dis) //如果有最短路就更改{dis[v]=dis[u]+edge[i].dis;if(vis[v]==0) //未入队则入队{vis[v]=1; //标记入队q.push(v);}}}}
}
int main()
{cin>>m>>n;s=n;for(int i=1; i<=m; i++){int f,g,w;cin>>f>>g>>w; addedge(f,g,w); //建图,有向图连一次边就可以了addedge(g,f,w);}spfa(); //开始跑spfacout<<dis[1]<<endl; //否则打印最短距离return 0;
}

D POJ 1502 心

也是最短路模板题,只是读入方式有些奇怪

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>#define inf 0x7f
using namespace std;
const int MAXN=10010,MAXM=500010;struct XY{int w,to,pre;
}e[MAXM];struct XX{int dis,num;
}d[MAXN],tmp;struct cmp1{bool operator ()(XX &a,XX &b){return a.dis>b.dis;}
};
char w[110];
int n,s,sz=0;
int las[100010];
bool flag[MAXN];
priority_queue<XX,vector<XX>,cmp1> q;void init()
{sz=0;memset(las,0,sizeof(las));memset(flag,0,sizeof(flag));
}
void add(int x,int y,int w){++sz;e[sz].to=y;e[sz].w=w;e[sz].pre=las[x];las[x]=sz;
}void Dijkstra(){int min,u=0;s=1;d[s].dis=0;q.push(d[s]);while (!q.empty()){u=q.top().num;q.pop();if (flag[u]) continue;flag[u]=true;for (int j=las[u];j;j=e[j].pre){int mu=e[j].to;if (d[mu].dis>d[u].dis+e[j].w){d[mu].dis=d[u].dis+e[j].w;q.push(d[mu]);}}}
}int zhuanhua(char s[])
{if(s[0]=='x')return inf;else{int sum=0;for(int i=0; i<strlen(s); i++)sum=sum*10+s[i]-'0';return sum;}
}int main(){while(scanf("%d",&n)!=EOF){init();memset(e,0,sizeof(e));for (int i=1;i<=n;++i){d[i].num=i;d[i].dis=2147483647;}for(int i=2;i<=n;i++){for(int j=1;j<i;j++){scanf("%s",w);int zz=zhuanhua(w);add(i,j,zz);add(j,i,zz);}}Dijkstra();int maxx=0;for (int i=1;i<=n;++i)maxx=max(maxx,d[i].dis);cout <<maxx;while(!q.empty())q.pop(); }return 0;
}

E HDU 5922 图

找规律,表面是最小生成树,但仔细看会发现将点1与其他点相连费用最低(因为费用为两点之和,而1是最小的数)

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{int t;cin>>t;for(int i=1;i<=t;i++){ll n;cin>>n;printf("Case #%d: %lld\n",i,(n-1)*(n+2)/2);}
}

F HDU 2112 论

也是最短路,不过每个站点都是具体的城市名,可以用map实现名字与编号的唯一对应

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<queue>
const long long inf=2147483647;
const int maxn=30005;
const int maxm=70005;
using namespace std;
int n,m,s,num_edge=0;
map<string,int>mp; 
int dis[maxn],vis[maxn],head[maxm];
struct Edge
{int next,to,dis;
}edge[maxm]; //结构体表示静态邻接表
void addedge(int from,int to,int dis) //邻接表建图
{ //以下是数据结构书上的标准代码,不懂翻书看解释edge[++num_edge].next=head[from]; //链式存储下一条出边edge[num_edge].to=to; //当前节点编号edge[num_edge].dis=dis; //本条边的距离head[from]=num_edge; //记录下一次的出边情况
}
void spfa()
{queue<int> q; //spfa用队列,这里用了STL的标准队列for(int i=1; i<=n; i++) {dis[i]=inf; //带权图初始化vis[i]=0; //记录点i是否在队列中,同dijkstra算法中的visited数组}q.push(s); dis[s]=0;
vis[s]=1; //第一个顶点入队,进行标记while(!q.empty()){int u=q.front(); //取出队首q.pop(); vis[u]=0; //出队标记for(int i=head[u]; i; i=edge[i].next) //邻接表遍历,不多解释了(也可用vector代替){int v=edge[i].to; if(dis[v]>dis[u]+edge[i].dis) //如果有最短路就更改{dis[v]=dis[u]+edge[i].dis;if(vis[v]==0) //未入队则入队{vis[v]=1; //标记入队q.push(v);}}}}
}
void init()
{num_edge=0;mp.erase(mp.begin(),mp.end());memset(head,0,sizeof(head));memset(edge,0,sizeof(edge));}
int main()
{while(cin>>m){init();if(m==-1)break;string a,end,b;cin>>a>>end;mp[a]=1;s=1;int cnt=1;for(int i=1; i<=m; i++){int w;cin>>a>>b>>w;if(mp[a]==0)mp[a]=++cnt;if(mp[b]==0)mp[b]=++cnt; addedge(mp[a],mp[b],w); //建图,有向图连一次边就可以了addedge(mp[b],mp[a],w);}n=cnt;spfa(); //开始跑spfaif(mp[end]==0||dis[mp[end]]==inf)cout<<"-1"<<endl;else cout<<dis[mp[end]]<<endl; //否则打印最短距离}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core部署中你不了解的框架依赖与独立部署

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9703460.htmlNET Core项目发布的时候你有没有注意到这两个选项呢&#xff1f;有没有纠结过框架依赖与独立部署到底有什么区别呢&#xff1f;如果有的话那么这篇文章可以参考下&#xff01;为什么…

【树链剖分】旅游(luogu 3976)

正题 luogu 3976 题目大意 给你一棵树&#xff0c;每个点有一个权值s 现在给你一条路径&#xff0c;让你选择两个点x,y&#xff0c;使y在x后面&#xff0c;且sy−sxs_y-s_xsy​−sx​最大 然后该路劲上所有点权值加v 解题思路 树链剖分 在线段树上维护从左到右和从右到左…

P7276-送给好友的礼物【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7276?contestId39577 题目大意 nnn个点的一棵树&#xff0c;kkk个关键点&#xff0c;两个人从根出发分别走一段路径回到根。要求每个关键点至少被一个人经过&#xff0c;求最短时间。 解题思路 相当于求两个覆盖所有关键点…

dump文件解析之探索.Net的内存

前言&#xff1a;对于需要长时间运行的.net程序&#xff0c;有时需要我们查看内存的使用有没有内存泄露问题。我们可以从dump文件中找到答案。Dump的看点用dump文件来分析内存&#xff0c;到底我们需要关心哪些点呢&#xff1f;内存的使用情况 HeapSize/object的数量 也就是托管…

Codeforces Round #654 (Div. 2)

A.Magical Sticks 贪心凑长度为nnn的木棒 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> using namespace std; int n; int main() {IO;int T;cin>>T;while(T--){cin>>n;cout<<(n1)/…

P3307-[SDOI2013]项链【Burnside引理,莫比乌斯反演,特征方程】

正题 题目链接:https://www.luogu.com.cn/problem/P3307 题目大意 nnn个珠子的一个环形项链&#xff0c;每个珠子有三个1∼k1\sim k1∼k的整数。 两个珠子不同当且仅当它们不能通过翻转或者旋转得到两个项链不同当且仅当它们不能通过旋转得到珠子要求上面的数字互质项链要求相…

【树链剖分】Milk Visits G(luogu 5838)

正题 luogu 5838 题目大意 给你一棵树&#xff0c;和若干查询&#xff0c;每次查询一条路径上是否有点的权值为x 解题思路 离线处理&#xff0c;每次将树上权值为x的点附上1的值&#xff0c;然后询问就是求和&#xff0c;查询完后清零 代码 #include<cstdio> #includ…

2020牛客暑期多校训练营(第二场)

2020牛客暑期多校训练营&#xff08;第二场&#xff09; 最烦英语题 文章目录A All with PairsB BoundaryC Cover the TreeD DurationE Exclusive ORF Fake MaxpoolingG Greater and GreaterH Happy TriangleI IntervalJ Just ShuffleK Keyboard FreeA All with Pairs B Bound…

鸿蒙 - arkTs:状态管理

状态 State&#xff1a; 在声明式UI中&#xff0c;以状态驱动视图更新 状态&#xff08;State&#xff09;&#xff1a;指驱动视图更新的数据&#xff08;被装饰器标记的变量&#xff09;视图&#xff08;View&#xff09;&#xff1a;基于UI描述渲染得到的用户界面 使用示例…

微软发布Azure Pipelines,开源项目可无限制使用CI/CD

微软发布了Azure Pipelines&#xff0c;他们新的CI/CD服务&#xff0c;是Azure DevOps产品的一部分。Azure Pipelines可用于构建、测试和部署工作负载&#xff0c;并可以让各种语言、项目类型和平台协同工作。作为Visual Studio Team Services&#xff08;VSTS&#xff09;的后…

Codeforces Round #653 (Div. 3)

A.Required Remainder 二分 #include<iostream> #include<algorithm> using namespace std; int main() {int T;ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>T;int x,y,n;while(T--){cin>>x>>y>>n;int l0,r(n-y)/x;while(…

【树链剖分】【倍增】宝石(2021GDOI Day2 T1)

正题 luogu 7518 题目大意 给你一棵树&#xff0c;一条路径的价值为&#xff1a;路径上点权以1开始依次递增1的子序列&#xff0c;有q次询问&#xff0c;每次询问一条路径的价值 解题思路 n,m值比较大&#xff0c;对于每次询问只有O(log2n)O(log^2n)O(log2n)的时间 考虑树链…

2020牛客暑期多校训练营(第一场)

文章目录A B-Suffix ArrayB Infinite TreeC DominoD Quadratic FormE Counting Spanning TreesF Infinite String Comparision题意&#xff1a;题解&#xff1a;代码&#xff1a;G BaXianGuoHai, GeXianShenTongH Minimum-cost FlowI 1 or 2J Easy Integration题意题解代码2020…

P4755-Beautiful Pair【笛卡尔树,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P4755 题目大意 nnn个数字的一个序列&#xff0c;求有多少个点对i,ji,ji,j满足aiaj≤max{ak}(k∈[l,r])a_i\times a_j\leq max\{a_k\}(k\in[l,r])ai​aj​≤max{ak​}(k∈[l,r]) 解题思路 如果构建一棵笛卡尔树的话那么两个点…

C# 接受MQTT服务器推送的消息

前言&#xff1a;MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议&#xff0c;采用轻量级发布和订阅消息传输机制。大家可以直接上GitHub下载MQQT服务的源码&#xff0c;源码地址&#xff1a;https://github.com/mqtt/mqtt.github.io/wiki/libraries主要内容…

【堆】【DP】Niyaz and Small Degrees(luogu 7600[APIO 2021 T3]/luogu-CF1119F)

正题 luogu 7600[APIO 2021 T3] luogu-CF1119F 题目大意 给你一棵树&#xff0c;给出每条边割掉的代价&#xff0c;问你对于0⩽k<n0\leqslant k<n0⩽k<n&#xff0c;使得每个点的度数小于k的最小代价 解题思路 首先考虑单询问的情况 可以设fx,1/0f_{x,1/0}fx,1/0​…

Boundary(2020多校第二场B)

Boundary&#xff08;2020多校第二场B&#xff09; 文章目录题意&#xff1a;题解&#xff1a;思路1&#xff1a;代码&#xff1a;思路二代码题意&#xff1a; 坐标平面有n个点&#xff08;不与原点&#xff08;0,0&#xff09;重复&#xff09;,现考虑一个圆&#xff0c;&…

.NET Core开发日志——Linux版本的SQL Server

SQL Server 2017版本已经可以在Linux系统上安装&#xff0c;但我在尝试.NET Core跨平台开发的时候使用的是Mac系统&#xff0c;所以这里记录了在Mac上安装SQL Server的过程。最新的SQL Server没有专门为Mac系统准备安装包&#xff0c;但由于Mac系统上支持Docker&#xff0c;所以…

P3313-[SDOI2014]旅行【树链剖分,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P3313 题目大意 nnn个点的一棵树&#xff0c;每个点有一个颜色和权值&#xff0c;有操作 修改一个点的权值修改一个点的颜色询问一条路径的某颜色的权值和询问一条路径的某颜色的权值最大值 解题思路 询问路径直接树剖先&am…

AIsing Programming Contest 2020 总结

A - Number of Multiples 按照题目意思走就行 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> using namespace std; int l,r,d; int main() {IO;cin>>l>>r>>d;if(r<l) swap(l,r);…