-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
图论 #1
Comments
二分图与匹配 黄哲威 |
浅谈一些树形问题 -- 高胜寒树的遍历宽度优先
vector<vector<int>> levelOrder(Node* root) {
if(!root) return {};
vector<vector<int>> ans;
queue<Node*> que;
que.push(root);
while(!que.empty())
{
vector<int> v;
for(int i=que.size();i;i--)
{
//压入当前层
Node* curr=que.front();
que.pop();
v.push_back(curr->val);
for(Node* it:curr->children)
que.push(it);
}
ans.push_back(v);
}
return ans;
} 深度优先
class Solution {
public:
vector<int> ans;
vector<int> inorderTraversal(TreeNode* root) {
if(root != NULL) {
inorderTraversal(root -> left);
ans.push_back(root -> val);
inorderTraversal(root -> right);
}
return ans;
}
};
树的存储
树问题的应用树形动态规划
最近公共祖先5种写法
DFS序+数据结构树链剖分动态树
其他总结根据题意, 判断是哪一类树形问题, 具体问题具体分析
|
浅析二分图匹配在信息学竞赛中的应用_王俊 |
生成树和拓扑排序_黄哲威并查集int fa[maxn];
int getroot(int x){
return x==fa[x]?x:getroot(fa(x));
}
void merge(int x,int y){
int p=getroot(x),q=getroot(y);
fa[p]=q;
}
int main(){
cin>>n;
for(int i=1;i<=n;++i)
fa[i]=i;
return 0;
}
并查集优化- 路径压缩 int fa[maxn];
int getroot(int x){
return x==fa[x]?x:fa[x]=getroot(fa(x));
}
void merge(int x,int y){
int p=getroot(x),q=getroot(y);
fa[p]=q;
}
int main(){
cin>>n;
for(int i=1;i<=n;++i)
fa[i]=i;
return 0;
} 并查集优化- 按秩合并
int fa[maxn],h[maxn];
int getroot(int x){
return x==fa[x]?x:getroot(fa(x));
}
void merge(int x,int y){
int p=getroot(x),q=getroot(y);
if(h[p]>h[q])swap(p,q);
fa[p]=q;h[q]++;
}
int main(){
cin>>n;
for(int i=1;i<=n;++i)
fa[i]=i;
return 0;
} 生成树Kruskalint n,m,ans;
struce edge{
u,v,w;
}e[M];
bool cmp(edge a, edge b){
return a.w<b.w;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;++i){
cin>>e[i].u>>e[i].v>>e[i].w;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;++i){
int p=getroot(e[i].u),q=getroot(e[i].v]);
if(p!=q){
fa[p]=q;
ans+=e[i].w;
}
}
return 0;
} Prim 算法拓扑排序int top,q[N];
int main(){
cin>>n>>m;
for(int i=1;i<=m;++i){
int u,v;
cin>>u>>v;
e[u].push_back(v);
d[v]++;
}
for(int i=1;i<=n;++i)
if(!d[i])
q[++top]=i;
while(top){
int u=q[top];top--;
for(int i=0;i<e[u].size();++i){
int v=e[u][i];
d[v]--;
if(!d[v])
q[++top]=v;
}
}
return 0;
}
|
图论复习 _ 未知作者图的存储形式:
传递闭包最小生成树
最短路的算法
二分图匹配
|
图论入门与最短路 _ 黄哲威#include<bits/stdc++.h>
using namespace std;
#define pa pair<int,int>
vector<pa>v;
int main(){
for(int i=1;i<=10;++i)
v.push_back(make_pair(rand(),i));
sort(v.begin(),v.end());
for(int i=0;i<v.size();++i)
cout<<v[i].first<<' '<<v[i].second<<endl;
return 0;
} #include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q; //小根堆
int main(){
for(int i=1;i<=10;++i)
q.push(rand());
for(int i=1;i<=10;++i){
cout<<q.top()<<endl;
q.pop();
}
return 0;
}
vector<int>e[N];
int main(){
cin>>n>>m;
for(int i=1;i<=m;++i){
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
return 0;
}
void bfs(int x){
int head=0,tail=1;
q[0]=x;vis[x]=1;
while(head!=tail){
int u=q[head];head++;
for(int i=0;i<E[u].size();++i){
int v=e[u][i];
if(!vis[v]){
vis[v]=1;
dis[v]=dis[u]+1;
q[tail++]=v;
}
}
}
}
void dfs(int x){
vis[x]=1;
for(int i=0;i<e[x].size();++i){
if(!vis[x][i])
dfs(e[x][i]);
}
} 最短路
void floyd(){
for(int k=1;k<=n;++k){
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
const int MAXN=1010;
const int INF=0x3f3f3f3f;
struct Edge{
int v;
int cost;
Edge(int _v,int _cost):v(_v),cost(_cost){}
};
vector<Edge>E[MAXN];
void addedge(int u,int v,int w){
E[u].push_back(E(v,w));
}
bool vis[MAXN];//判断在队列标注
int cnt[MAXN];//判断每个点入队列次数,以判断是否存在负环回路
int dist[MAXN];
bool SPFA(int start, int n){
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;++i)dist[i]=INF;
queue<int>que;
while(!que.empty())que.pop();
que.push(start);
vis[start]=true;
dist[start]=0;
memset(cnt,0,sizeof(cnt));
cnt[start]=1;
while(!que.empty){
int u=que.front();
que.pop();
if(vis[u])continue;
vis[u]=false;
for(int i=0;i<E[u].size();++i){
int v=E[u][i].v;
if(dist[u]+E[u][i].cost<dist[v]){
dist[v]=dist[u]+E[u][i].cost;
if(!vis[v]){
vis[v]=true;
que.push(v);
if(++cnt[v]>n)return false;
}
}
}
}
return true;
}
const int INF=0x3f3f3f3f;
const int MAXN=100010;
struct qnode{
int v;
int c;
qnode(int _v=0,int _c=0):v(_v),c(_c){}
bool operator < (const qnode& r)const{
return c>r.c;
}
};
struct Edge{
int v,cost;
Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<Edge>E[MAXN];
bool vis[MAXN];
int dist[MAXN];
//点的编号从1开始
void Dijkstra(int n,int start){
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;++i)dis[i]=INF;
priority_queue<qnode>que;
while(!que.empty())que.pop();
dis[start]=0;
que.push(qnode(start,0));
qnode tmp;
while(!que.empty()){
tmp=que.top();
que.pop();
int u=tmp.v;
if(vis[u])continue;
vis[u]=true;
for(int i=0;i<E[u].size();++i){
int v=E[tmp.v][i].v;
int cost=E[u][i].cost;
if(!vis[v]&&dist[u]+cost<dist[v]){
dist[v[=dist[u]+cost;
que.push(qnode(v,dist[v]));
}
}
}
}
void addedge(int u,int v,int w){
E[u].push_back(Edge(v,w));
}
n个点, m条边的有向图, 有些边是单向边, 有些边是双向边, 每个点有物品的买入和卖出价格. 现在从1号点走到n号点, 途中只能买一次物品,并在这之后卖出, 问最多能赚多少钱?
|
图论知识及其应用 |
树分治_黄哲威 |
树链剖分_蒋一瑶 |
树上倍增_黄哲威 |
图论_李煜东图的遍历
const int maxn=1000;
//采用链式前向星存储图
bool vis[maxn]={0};
void dfs(int s){
vis[s]=true;
//遍历当前点的所有邻接点
for(int i=head[s];i!=-1;i=edge[i].next){
dfs(edge[i].to);
}
}
void bfs(int s){
int que[maxn];
int iq=0;
que[id++]=s;
int i,k;
//循环至队列元素为空
for(i=0;i<iq;++i){
vis[que[i]]=ture;
for(k=head[que[i]];k!=-1;k=edge[k].next){
if(!vis[edge[k].to])
que[iq++]=edge[k].to;
}
}
}
//输入数据时统计每个点的入度,并存入indegree数组。
int queue[maxn];
int iq=0;
for(int i=1;i<=n;i++)
{
if(indegree[i]==0)
{
queue[iq++]=i;
}
}
for(int i=0;i<iq;i++)
{
for(k=head[queue[i]];k!=-1;k=edge[k].next)
{
indegree[edge[k].to]--;
if(indegree[edge[k].to]==0)
{
queue[iq++]=edge[k].to;
}
}
} 最短路问题
Floyd算法可以经过标号<=k的点中转时, 从i到j的最短路 Dijkstra 算法普通: O(n^2) Bellman-Ford算法BF算法: O(N^2)
最小生成树KruskalO(MlogN) PrimO(N^2)
树上的倍增法LCA
二分图二分图匹配最大匹配增广路算法(匈牙利算法) 最小点覆盖 |
图论知识及其应用 |
图论专题生成树_唐文斌 |
网络流_未知作者 |
网络流_魏越闽 |
网络流_周津浩&黄着威 |
网络流建模 周尚彦 |
线性规划与网络流_曹钦翔 |
2-SAT问题_未知作者 |
倍增及其应用 _ 未知作者
The text was updated successfully, but these errors were encountered: