【算法模板】图论
来源:互联网 发布:淘宝店怎么提升销量 编辑:程序博客网 时间:2024/05/01 14:02
dji:
#include <iostream>#include <cstring>#include <vector>#include <queue>#define N 100 using namespace std;typedef struct No{int u,v,w;No(int a,int b,int c){u=a,v=b,w=c;}bool operator<(const No &dd)const{ return w>dd.w; }}No;int dist[N];vector<No> q[N];void Dji(int n0){int vis[N];memset(vis,0,sizeof(vis));memset(dist,63,sizeof(dist));dist[n0]=0;vis[n0]=1;priority_queue<No>que;que.push(No(0,n0,dist[n0]));while (!que.empty()){No x=que.top();que.pop();for (int i=0;i<q[x.v].size();i++){No y=q[x.v][i];if (dist[y.v]>dist[x.v]+y.w){dist[y.v]=dist[x.v]+y.w;que.push(No(x.v,y.v,dist[y.v]));}}}}int main(){int m,n;cin>>n>>m;for (int i=0;i<m;i++){int u,v,w;cin>>u>>v>>w;q[u].push_back(No(u,v,w));q[v].push_back(No(v,u,w));}int uu;cin>>uu;Dji(uu);for (int i=1;i<=n;i++) if (i!=uu) cout<<uu<<" to "<<i<<" mincost:"<<dist[i]<<endl; cout<<endl;}/*7 111 2 71 4 52 4 92 3 82 5 74 5 154 6 66 5 86 7 115 7 93 5 5*/
floyd:
#include<cstdio>#include<iostream>#define maxx 101using namespace std;int map[maxx][maxx],n,i,j,k,a,b,q;int main(){ scanf("%d\n",&n); for (i=1;i<=n;i++) for (j=1;j<=n;j++) { scanf("%d",&map[i][j]); if (map[i][j]==-1) map[i][j]=100000; } for (k=1;k<=n;k++) for (i=1;i<=n;i++) if (i!=k) for (j=1;j<=n;j++) if (i!=j&&j!=k) { if ((map[i][k]+map[k][j]<map[i][j]))map[i][j]=map[i][k]+map[k][j]; }cout<<"查询组数:";cin>>q; for (i=1;i<=q;i++) { cin>>a>>b; cout<<"min:"<<map[a][b]<<endl; } return 0;}/*70 7 -1 5 -1 -1 -17 0 8 9 7 -1 -1-1 8 0 -1 5 -1 -1 5 9 -1 0 15 6 -1-1 7 5 15 0 8 9-1 -1 -1 6 8 0 11-1 -1 -1 -1 9 11 061 2 1 31 41 51 61 7*/
#include<cstdio>#include<iostream>#include<cstdlib>#define maxx 100000using namespace std;typedef struct edge{int x,y,w;}edge;edge e[maxx];int r[maxx],f[maxx];long long sum=0;int find(int x){return x==f[x]?x:f[x]=find(f[x]);}int cmp(const void *a, const void *b){if ((*(edge *)a).w == (*(edge *)b).w) return (*(edge *)a).w-(*(edge *)b).w;return (*(edge *)a).w-(*(edge *)b).w ; }int main(){ ios::sync_with_stdio(false); int i,n,m,x,y,chx,chy; cin>>m>>n; for (i=0;i<n;i++) { cin>>e[i].x>>e[i].y>>e[i].w; f[i]=i; r[i]=0; }qsort(e,n,sizeof(edge),cmp);sum=0;for (i=0;i<n;i++) { x=find(e[i].x); y=find(e[i].y); if (x!=y) { if (r[x]>r[y]) f[y]=x; else { if (r[x]==r[y]) r[y]++; f[x]=y; } sum+=e[i].w; cout<<e[i].x<<"<=>"<<e[i].y<<" cost:"<<e[i].w<<endl; } } cout<<"mincost:"<<sum<<endl; return 0;}/*7 111 2 71 4 52 4 92 3 82 5 74 5 154 6 66 5 86 7 115 7 93 5 5*/
prim:
#include<cstdio>#include<iostream>using namespace std;#define M 101int map[M][M]={0},cost[M]={0},vis[M]={0},i,j,n,min1,ans=0;int main(){ scanf("%d",&n); for (i=1;i<=n;i++) for (j=1;j<=n;j++) scanf("%d",&map[i][j]); ans=0; for (i=1;i<=n;i++) { cost[i]=map[i][1]; vis[i]=1; } vis[1]=-1; for (i=1;i<=n;i++) { min1=1000000; int v=-1; for (j=1;j<=n;j++) if (vis[j]!=-1&&cost[j]<min1) { v=j; min1=cost[j]; } if (v!=-1) { cout<<i<<"<=>"<<v<<" cost"<<min1<<endl; ans+=min1; vis[v]=-1; for (j=1;j<=n;j++) if (vis[j]!=-1&&map[v][j]<cost[j]) { cost[j]=map[v][j]; vis[j]=v; } } } printf("mincost:%d",ans); return 0;}/*40 4 9 214 0 8 179 8 0 1621 17 16 0*/
spfa:
void Spfa() { memset(Dis,63,sizeof(Dis)); Dis[1]=0; Vis[1]=true; deque<int> Q; Q.push_back(1); while(!Q.empty()) { int u=Q.front(); for(Node *i=G[u].nxt;i;i=i->nxt) { int v=i->to,w=i->w; if(Dis[v]>Dis[u]+w) { Dis[v]=Dis[u]+w; if(Vis[v])continue; Vis[v]=true; if(!Q.empty()) { if(Q.front()>Dis[v])Q.push_front(v); else Q.push_back(v); } else Q.push_back(v); } } Vis[u]=false; } }
topo-DAG:
#include <iostream>#include <cstring>#include <vector>#include <queue>#define N 100 #define maxx 9999999#define minn -1using namespace std;typedef struct No {int u,v,w;No(int a,int b,int c){u=a,v=b,w=c;}}No;vector<No> T[N];vector<int> topol;int dist[N];bool vis[N];void topo(int now){if (!vis[now]) vis[now]=1;for (int i=0;i<T[now].size();i++){if (!vis[T[now][i].v]) topo(T[now][i].v);}topol.push_back(now);}void DAG(int n,int k){for (int i=1;i<=n;i++) dist[i]=maxx;dist[k]=0;for (int i=1;i<=n;i++){for (int j=0;j<T[i].size();j++){int to=T[i][j].v;if (dist[to]>dist[i]+T[i][j].w)dist[to]=dist[i]+T[i][j].w;}}return; }int main(){int m,n;cin>>n>>m;for (int i=0;i<m;i++){int u,v,w;cin>>u>>v>>w;T[u].push_back(No(u,v,w));}memset(vis,0,sizeof(vis));for (int i=1;i<=n;i++) if(!vis[i]) topo(i);for (int i=topol.size()-1;i>=0;i--) cout<<topol[i]<<" ";cout<<endl;int k;cin>>k;DAG(n,k);for (int i=1;i<=n;i++)cout<<k<<" to "<<i<<" mincost:"<<dist[i]<<endl;cout<<endl;}/*7 111 2 71 4 52 4 92 3 82 5 74 5 -54 6 65 6 86 7 115 7 93 5 5*/
无向图双联通分支,割点:
#include<iostream>#include<cstring>#include<vector>#include<stack>#define N 1000using namespace std;typedef struct dd{int u;int v;}dd;int flag[N],low[N],df[N],dfsnum=0,num=0;vector<int> gra[N];vector<int> gp;vector<dd> bri;stack<int> s;void tarjan(int u,int fa){ flag[u]=low[u]=++dfsnum; s.push(u); int ch=0; for(int i=0;i<gra[u].size();i++) { int v=gra[u][i]; if(!flag[v]) { ch++;df[v]=u; tarjan(v,u); low[u]=min(low[u],low[v]); if (df[u]==-1 && ch>1) gp.push_back(u); if (df[u]!=-1 && flag[u]<=low[v]){ gp.push_back(u);} } else if(v!=fa) { low[u]=min(low[u],flag[v]); } } if(low[u]==flag[u]) { num++; cout<<"NO."<<num<<" : "; while (1) { int x=s.top(); cout<<x<<" "; s.pop(); if(x==u) { cout<<endl; break; }} }}int main(){int m,n;cin>>n>>m;memset(df,-1,sizeof(df));memset(flag,0,sizeof(flag));for (int i=0;i<m;i++){int u,v;cin>>u>>v;gra[u].push_back(v);gra[v].push_back(u);//df[u]=v;df[v]=u;dd sd;sd.u=u;sd.v=v;bri.push_back(sd);}cout<<"对于边的双连通分支:"<<endl; for (int i=0;i<n;i++)if (!flag[i]) tarjan(i,-1);cout<<"割点:"<<endl; for (int i=0;i<gp.size();i++) cout<<gp[i]<<" ";cout<<endl<<"桥:"<<endl; for (int i=0;i<m;i++){int uu=bri[i].u,vv=bri[i].v;if (flag[uu]<low[vv]) cout<<uu<<"<->"<<vv<<endl;}//for(int i=0;i<n;i++)cout<<low[i]<<" "<<flag[i]<<" "<<df[i]<<endl;return 0;}
有向图强连通分支:
#include<iostream>#include<cstring>#include<vector>#include<stack>#define N 1000using namespace std;typedef struct dd{int u;int v;}dd;int flag[N],low[N],df[N],dfsnum=0,num=0;vector<int> gra[N];vector<int> gd;stack<int> s;;void tarjan(int u){ flag[u]=low[u]=++dfsnum; s.push(u); df[u]=1; for(int i=0;i<gra[u].size();i++) { int v=gra[u][i]; if(!flag[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(df[v]) { low[u]=min(low[u],flag[v]); } } if(low[u]==flag[u]) { gd.push_back(u); num++; cout<<"NO."<<num<<" : "; while (1) { int x=s.top(); cout<<x<<" "; s.pop(); df[x]=0; if(x==u) { cout<<endl; break; }} }}int main(){int m,n;cin>>n>>m;for (int i=0;i<m;i++){int u,v;cin>>u>>v;gra[u].push_back(v);}cout<<"强连通分支:"<<endl; memset(flag,0,sizeof(flag));memset(df,0,sizeof(df));for (int i=0;i<n;i++)if (!flag[i]) tarjan(i);for (int i=0;i<gd.size();i++) cout<<gd[i]<<" ";return 0;}/*6 80 20 13 01 34 53 52 42 3*/
0 0
- 【图论】匈牙利算法模板
- 【算法模板】图论
- 图论---POJ 3660 floyd 算法(模板题)
- 匈牙利算法模板+KM算法模板
- 【模板】基础算法&&小算法
- 最大流算法模板
- 快速幂取模算法模板
- Dinic 算法模板
- 基础SPFA算法模板
- 最大流算法模板
- kmp算法模板
- rmq算法模板
- poj3461KMP算法模板
- KM算法模板
- 匈牙利算法模板
- Sap算法模板
- kmp算法模板
- 算法优化-模板运算
- java.util.concurrent之ForkJoin
- Windows下查询域名的DNS TXT记录的命令
- poj_2065 SETI(高斯消元解同余方程组)
- hashmapper的使用以及json字符串与普通字符串的差异
- Linux下使用shell解压打包jar包
- 【算法模板】图论
- apache 配置动静分离,允许跨域, 并在反向代理的情况下维持默认主页
- pjsip
- Y2K Accounting Bug(POJ 2586)(贪心)
- 没有卑微
- 什么是hack技术
- Linux下MySQL安装与配置
- Opencv(py/vs)
- 简单三步:iOS配置HTTPS支持苹果ATS?