3.图:
(1)图存储结构与遍历:
图综合练习--构建邻接表
#include<bits/stdc++.h>
using namespace std;
class arcnode
{
public:
int i;
arcnode *next;
};
class vnode
{
public:
char data;
int flag;
arcnode *first;
};
class mygra
{
public:
vnode *ver;
int vexnum;
int arcnum;
int ffind(char ch)
{
int i;
for(i=0; i<vexnum; i++)
{
if(ch==ver[i].data)
return i;
}
}
void iinsert(int n1,int n2)
{
arcnode *p=new arcnode;
p->i=n2;
p->next=NULL;
arcnode *q = ver[n1].first;
while (q->next!=NULL)
q= q->next;
q->next=p;
}
mygra(int n,int m,char ddata[])
{
vexnum=n;
arcnum=m;
ver=new vnode[vexnum];
int i;
for(i=0; i<vexnum; i++)
{
ver[i].data=ddata[i];
ver[i].flag=0;
ver[i].first=new arcnode;
ver[i].first->next=NULL;
}
/*while(arcnum--)
{
char a;
char b;
int ii;
int jj;
cin >> a >> b;
for(ii=0;ii<vexnum;ii++)
if(ver[ii].data==a)
break;
for(jj=0;jj<vexnum;jj++)
if(ver[jj].data==b)
break;
if(ver[ii].flag==0)
ver[ii].first=new arcnode(jj);
if(ver[ii].flag!=0)
ver[ii].first->next=new arcnode(jj);
}*/
while(arcnum--)
{
char a;
char b;
cin >>a >>b;
iinsert(ffind(a),ffind(b));
}
/* int ffind(char ch)
{
int i;
for(i=0;i<vexnum;i++)
{
if(ch==ver[i].data)
return i;
}
}*/
}
void display()
{
int i;
for (i=0; i<vexnum; i++)
{
cout << i << " " << ver[i].data;
arcnode *ps = new arcnode;
ps = ver[i].first->next;
while (ps!= NULL)
{
cout << "-" << ps->i;
ps= ps->next;
}
cout << "-^" << endl;
}
}
};
int main()
{
int t;
cin>>t;
while(t--)
{
int vex;
int arc;
cin >> vex >> arc;
char asou[vex];
int i;
for(i=0; i<vex; i++)
cin>>asou[i];
mygra p(vex,arc,asou);
p.display();
}
}
DS图—图的邻接矩阵存储及度计算
#include<iostream>
using namespace std;
#define N 500
class mygraph
{
private:
int vex;
int arc;
int mar[N][N];
int in[N]= {0};
int out[N]= {0};
string ve[N];
char kind;
public:
int find(string ex)
{
int i;
for(i=0; i<vex; i++)
{
if(ex==ve[i])
return i;
}
}
mygraph(char k,int v,string data[],int a)
{
kind=k;
vex=v;
arc=a;
int i;
int j;
for (i = 0; i <vex; i++)
ve[i]=data[i];
for (i = 0; i < vex; i++)
{
for (j = 0; j < vex ; j++)
mar[i][j]=0;
}
while(arc--)
{
if(kind=='D')
{
string t, h;
cin >> t >> h;
mar[find(t)][find(h)] = 1;
out[find(t)]++;
in[find(h)]++;
}
if (kind == 'U')
{
string t, h;
cin >> t >> h;
mar[find(t)][find(h)] = 1;
mar[find(h)][find(t)] = 1;
in[find(h)]++;
out[find(t)]=out[find(t)]+1;
}
}
}
void display()
{
int i;
int j;
for (i = 0; i < vex; i++)
{
for (j = 0; j < vex - 1; j++)
cout << mar[i][j] << ' ';
cout << mar[i][vex - 1] << endl;
}
for ( i = 0; i < vex; i++)
if (out[i] + in[i] && kind == 'D')
cout << ve[i] << ": " << out[i] << ' ' << in[i] << ' ' << out[i] + in[i]<< endl;
else if (out[i] + in[i] && kind == 'U')
cout << ve[i] << ": " << out[i] + in[i]<< endl;
for ( i = 0; i < vex; i++)
if (out[i] + in[i] == 0)
cout << ve[i] << endl;
}
};
int main()
{
int t;
cin>>t;
while(t--)
{
char k;
int v;
cin >> k >> v;
string p[v];
int i;
for(i=0; i<v; i++)
cin >> p[i];
int as;
cin >>as;
mygraph pp(k,v,p,as);
pp.display();
}
}
DS图遍历--深度优先搜索
#include<bits/stdc++.h>
using namespace std;
class mygraph
{
private:
int vex;
int **mar;
int *temp;
public:
mygraph(int v)
{
vex=v;
mar = new int* [vex];
temp = new int[vex];
int i;
int j;
for (i = 0; i < vex; i++)
mar[i] = new int[vex];
for (i = 0; i < vex; i++)
for (j = 0; j < vex; j++)
cin >>mar[i][j];
for ( i = 0; i < vex; i++)
temp[i] = 0;
}
void dfs(int pp)
{
temp[pp] = 1;
cout << pp << " ";
int i;
for (i = 0; i < vex; i++)
if (!temp[i]&& mar[pp][i])
dfs(i);
}
void dfs()
{
int i;
for (i=0; i <vex; i++)
{
if (temp[i] == 0)
dfs(i);
}
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
int ve;
cin >>ve;
mygraph ou(ve);
ou.dfs(0);
ou.dfs();
cout << endl;
}
}
DS图遍历--广度优先搜索
#include<bits/stdc++.h>
using namespace std;
class mygraph
{
private:
int vex;
int **mar;
int *temp;
public:
mygraph(int v)
{
vex=v;
mar = new int* [vex];
temp = new int[vex];
int i;
int j;
for (i = 0; i < vex; i++)
mar[i] = new int[vex];
for (i = 0; i < vex; i++)
for (j = 0; j < vex; j++)
cin >>mar[i][j];
for ( i = 0; i < vex; i++)
temp[i] = 0;
}
void dfs(int pp)
{
temp[pp] = 1;
cout << pp << " ";
int i;
for (i = 0; i < vex; i++)
if (!temp[i]&& mar[pp][i])
dfs(i);
}
void dfs()
{
int i;
for (i=0; i <vex; i++)
{
if (temp[i] == 0)
dfs(i);
}
}
void bfs(int op)
{
int ws, us;
int is, ks;
int *adj= new int[vex];
queue <int>qq;
for (is = 0; is < vex; is++)
temp[is] = 0;
for (op=0; op < vex; op++)
{
if (!temp[op])
{
temp[op] = 1;
qq.push(op);
while (!qq.empty())
{
us = qq.front();
cout << us << ' ';
qq.pop();
for (is = 0; is < vex; is++)
adj[is] = -1;
int posd = 0;
for (ks = 0; ks < vex; ks++)
{
if (mar[us][ks])
{
adj[posd++] = ks;
}
}
is= 0;
for (ws= adj[is]; ws >= 0; ws = adj[is++])
{
if (temp[ws] == 0)
{
temp[ws] = 1;
qq.push(ws);
}
}
}
}
}
}
void bfs()
{
bfs(0);
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
int ve;
cin >>ve;
mygraph ou(ve);
ou.bfs();
cout << endl;
}
}
DS图—图非0面积
#include<bits/stdc++.h>
#include<queue>
using namespace std;
#define N 500
#define P 4
class mygraph
{
private:
int vex;
int **mar;
int *temp;
public:
mygraph(int v)
{
vex=v;
mar = new int* [vex];
temp = new int[vex];
int i;
int j;
for (i = 0; i < vex; i++)
mar[i] = new int[vex];
for (i = 0; i < vex; i++)
for (j = 0; j < vex; j++)
cin >>mar[i][j];
for ( i = 0; i < vex; i++)
temp[i] = 0;
}
void dfs(int pp)
{
temp[pp] = 1;
cout << pp << " ";
int i;
for (i = 0; i < vex; i++)
if (!temp[i]&& mar[pp][i])
dfs(i);
}
void dfs()
{
int i;
for (i=0; i <vex; i++)
{
if (temp[i] == 0)
dfs(i);
}
}
void bfs(int op)
{
int ws, us;
int is, ks;
int *adj= new int[vex];
queue <int>qq;
for (is = 0; is < vex; is++)
temp[is] = 0;
for (op=0; op < vex; op++)
{
if (!temp[op])
{
temp[op] = 1;
qq.push(op);
while (!qq.empty())
{
us = qq.front();
cout << us << ' ';
qq.pop();
for (is = 0; is < vex; is++)
adj[is] = -1;
int posd = 0;
for (ks = 0; ks < vex; ks++)
{
if (mar[us][ks])
{
adj[posd++] = ks;
}
}
is= 0;
for (ws= adj[is]; ws >= 0; ws = adj[is++])
{
if (temp[ws] == 0)
{
temp[ws] = 1;
qq.push(ws);
}
}
}
}
}
}
void bfs()
{
bfs(0);
}
};
class mapd
{
public:
int mygraph[N][N];
int m,n;
mapd(int mval,int nval)
{
m=mval;
n=nval;
int i;
int j;
for(i=0; i<=m+1; i++)
for(j=0; j<=n+1; j++)
mygraph[i][j]=0;
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
cin >> mygraph[i][j];
}
void bfs()
{
int xx;
int yy=0;
xx=0;
int i;
queue<int> Q1,q2;
Q1.push(xx);
q2.push(yy);
mygraph[xx][yy]=1;
int ndx[P]= {-1,0,1,0};
int ndy[P]= {0,1,0,-1};
while(!Q1.empty())
{
for(i=0; i<P; i++)
{
if(mygraph[Q1.front()+ndx[i]][q2.front()+ndy[i]]==0&&Q1.front()+ndx[i]>=0&&Q1.front()+ndx[i]<=m+1&&q2.front()+ndy[i]>=0&&q2.front()+ndy[i]<=n+1)
{
q2.push(q2.front()+ndy[i]);
Q1.push(Q1.front()+ndx[i]);
mygraph[Q1.front()+ndx[i]][q2.front()+ndy[i]]=1;
}
}
Q1.pop();
q2.pop();
}
}
void display()
{
int mum;
mum=0;
int i;
int j;
for(i=0; i<=m; i++)
for(j=0; j<=n; j++)
if(mygraph[i][j]==0)
mum++;
cout<<mum<<endl;
}
};
int main()
{
int t;
cin >> t;
while(t--)
{
int o;
int p;
cin >> o >> p;
mapd mgraph(o,p);
mgraph.bfs();
mgraph.display();
}
}
(2)图联通与生成树:
DS图—图的连通分量
#include<bits/stdc++.h>
using namespace std;
#define P 0
int csou;
int num;
string mian[56];
int mar[56][56];
int temp[56];
int xunzhao(string asou)
{
for (int i = 0; i < num; i++)
if (asou == mian[i])
return i;
}
void Dfs(int id)
{
temp[id] = 1;
int j;
for(j=0; j<num; j++)
if (mar[id][j] && !temp[j])
{
Dfs(j);
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
csou= P;
cin >> num;
int i;
int j;
for (i = 0; i < num; i++)
cin >> mian[i];
for (i = 0; i < num; i++)
temp[i] = 0;
for (i = 0; i < num; i++)
for (j = 0; j < num; j++)
mar[i][j] = 0;
int ll;
cin >> ll;
while (ll--)
{
string as, bs;
cin >> as >> bs;
int at;
int bt;
at=xunzhao(as);
bt=xunzhao(bs);
mar[at][bt]=1;
mar[bt][at]=1;
}
for(i=0; i<num; i++)
if (!temp[i])
{
temp[i] = 1;
csou=csou+1;
Dfs(i);
}
for (i = 0; i < num; i++)
{
cout << mian[i];
if (i == num - 1)
cout << endl;
else
cout << " ";
}
for (i = 0; i < num; i++)
for (j = 0; j < num; j++)
{
cout << mar[i][j];
if (j == num - 1)
cout << endl;
else
cout << " ";
}
cout << csou << endl << endl;
}
}
村村通工程(Prim算法)
#include<bits/stdc++.h>
using namespace std;
struct c
{
int adj;
int money =0x3f3f3f3f;
} c[108];
struct p
{
int he;
int ta;
};
struct v
{
int indexx;
string data;
} v[108];
class tu
{
private:
int mar[108][108];
int vnumber;
int sum = 0;
vector<p> path;
public:
tu()
{
int i;
int j;
int e;
for(i=0; i<108; i++)
for(j=0; j<108; j++)
mar[i][j]=0;
cin >> vnumber;
for (i = 0; i < vnumber; i++)
{
cin >> v[i].data;
v[i].indexx = i;
}
cin >> e;
for (i = 0; i < e; i++)
{
string tai;
string hea;
int costmoney;
cin >> tai >> hea >> costmoney;
mar[get(tai)][get(hea)] = costmoney;
mar[get(hea)][get(tai)] = costmoney;
}
string begine;
cin >> begine;
prim(get(begine));
}
int get(string &f);
void prim(int begin);
};
void tu::prim(int begin)
{
int i;
int j;
for (i = 0; i < vnumber; i++)
if (!mar[begin][i])
c[i].adj = begin;
else
{
c[i].adj=begin;
c[i].money=mar[begin][i];
}
c[begin].money = 0;
for (i = 1; i < vnumber; i++)
{
int min;
int nextt;
min=0x3f3f3f3f;
for (j = 0; j < vnumber; j++)
if (min > c[j].money && c[j].money)
{
nextt = j;
min = c[j].money;
}
c[nextt].money = 0;
p passpass;
passpass.he= c[nextt].adj;
passpass.ta=nextt;
path.push_back(passpass);
sum+=min;
for (j = 0; j < vnumber; j++)
if (mar[nextt][j] && c[j].money > mar[nextt][j])
{
c[j].adj=nextt;
c[j].money=mar[nextt][j];
}
}
cout << sum << endl;
for (auto &it: path)
cout << v[it.he].data << ' ' << v[it.ta].data << ' ' << mar[it.he][it.ta] << endl;
}
int tu::get(string &f)
{
int i;
for (i = 0; i < vnumber; i++)
if (v[i].data== f)
return i;
}
int main()
{
int t;
tu res;
}
村村通工程(Kruskal算法)
#include<bits/stdc++.h>
using namespace std;
class ed
{
public:
string ta;
string he;
int quan;
};
bool cpr(ed rhs, ed lhs)
{
return rhs.quan<lhs.quan;
}
class tu
{
private:
ed *edg;
string* data;
int vnum;
int enume;
int *temp;
public:
int find(string str)
{
int i;
for (i = 0; i <vnum; i++)
if (str == data[i])
return i;
}
void k();
tu(int v)
{
int i;
int j;
vnum=v;
data = new string[vnum];
for (i = 0; i < v; i++)
cin >> data[i];
cin >> enume;
edg = new ed[enume];
for (i = 0; i < enume; i++)
cin >> edg[i].he >> edg[i].ta >> edg[i].quan;
temp = new int[vnum];
for ( j = 0; j < v; j++)
temp[j] = j;
}
};
void tu::k()
{
int j;
int wsum;
int indexx;
indexx=0;
wsum=0;
ed*res = new ed[vnum - 1];
int i;
sort(edg, edg + enume, cpr);
for (i = 0; indexx != vnum-1&& i < enume; i++)
{
if (temp[find(edg[i].he)] != temp[find(edg[i].ta)])
{
res[indexx++] = edg[i];
wsum = edg[i].quan+wsum;
}
int cmp = temp[find(edg[i].ta)];
for (j = 0; j < vnum; j++)
{
if (temp[j] == cmp)
temp[j] = temp[find(edg[i].he)];
}
}
for (i = 0; i < vnum - 1; i++)
{
if (temp[i] != temp[i + 1])
{
cout << "-1" << endl;
return;
}
}
cout << wsum << endl;
for (i = 0; i <vnum - 1; i++)
{
if (find(res[i].he) >=find(res[i].ta))
cout << res[i].ta << " " << res[i].he << " " << res[i].quan << endl;
else
cout << res[i].he<< " " << res[i].ta << " " << res[i].quan << endl;
}
}
int main()
{
int vsoul;
cin>>vsoul;
tu res(vsoul);
res.k();
}
(3)拓扑排序与最短路径:
DS图—图的最短路径(无框架)
#include<bits/stdc++.h>
using namespace std;
#define P 1001
class tu
{
private:
int mar[1001][1001];
vector<int> pathh[1001];
int dis[1001];
string ver[1001];
int vnum;
string begin;
int vir[1001];
public:
tu(int v)
{
int u;
int w;
for(u=0; u<P; u++)
for(w=0; w<P; w++)
mar[u][w]=0;
for(w=0; w<P; w++)
dis[w]=0;
for(u=0; u<P; u++)
vir[u]=0;
vnum=v;
int i;
for(i=0; i<v; i++)
cin>>ver[i];
int j;
for(i=0; i<v; i++)
for(j=0; j<vnum; j++)
cin>>mar[i][j];
cin>>begin;
}
void display()
{
d();
int i;
for(i=0; i<vnum; i++)
{
if(i== gin(begin))
continue;
if(!dis[i])
cout<<begin<<'-'<<ver[i]<<"--1"<<endl;
else
{
cout<<begin<<'-'<<ver[i]<<'-'<<dis[i]<<"----[";
for(auto&it:pathh[i])
cout<<ver[it]<<' ';
cout<<"]\n";
}
}
}
int gin(string &dw);
void d();
};
void tu::d()
{
int beginin;
int i;
int j;
beginin=gin(begin);
for(i=0; i<vnum; i++)
{
if(mar[beginin][i]!=0)
{
dis[i]=mar[beginin][i];
pathh[i].push_back(beginin);
pathh[i].push_back(i);
}
}
vir[beginin]=1;
for(i=0; i<vnum-1; i++)
{
int mind;
mind=0x3f3f3f3f;
int min;
for(j=0; j<vnum; j++)
if(dis[j]!=0&&dis[j]<mind&&vir[j]==0)
{
mind=dis[j];
min=j;
}
vir[min]=1;
for(j=0; j<vnum; j++)
if(vir[j]==0&&(!dis[j]||mind+mar[min][j]<dis[j])&&mar[min][j]!=0)
{
dis[j]=mind+mar[min][j];
pathh[j]=pathh[min];
pathh[j].push_back(j);
}
}
}
int tu::gin(string &dw)
{
int i;
for(i=0; i<vnum; i++)
if(dw==ver[i])
return i;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int vsu;
cin >> vsu;
tu mytu(vsu);
mytu.display();
}
}
图综合练习--拓扑排序
#include<iostream>
using namespace std;
#define o 612
bool done[612];
int mar[612][612];
int find(int num)
{
int i;
int j;
for (j =0; j <num; j++)
{
int temp;
temp=0;
for (i = 0; i < num; i++)
{
if (mar[i][j] != 0)
temp=1;
}
if ( done[j] == false&&temp == 0)
{
done[j]=true;
return j;
}
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
int num;
cin >> num;
int u;
u=num;
int i;
int j;
for (j =0; j <num; j++)
done[j]=false;
for (i = 0; i < o; i++)
for (j = 0; j < o; j++)
mar[i][j]=0;
for (i = 0; i < num; i++)
for (j = 0; j < num; j++)
cin >> mar[i][j];
int as;
for (as = 0; as < num; as++)
{
int p;
p=find(u) ;
cout << p<< " ";
for (i=0; i<num; i++)
mar[p][i] = 0;
}
cout << endl;
}
}
货币套汇(图路径)
#include<bits/stdc++.h>
using namespace std;
int num;
double minw = 1e-7;
int mum;
void fuloyide( double **dval)
{
double **res = new double *[num];
int i;
for (i = 0; i < num; i++)
{
int j;
res[i] = new double[num];
for (j = 0; j < num; j++)
{
if (i != j)
{
if(dval[i][j]>minw)
res[i][j]=dval[i][j];
else
res[i][j]=minw;
}
else
res[i][j] = 1.0;
}
}
int j;
int k;
for (k = 0; k < num; k++)
for (i = 0; i < num; i++)
for (j = 0; j < num; j++)
if (res[i][j] < res[i][k] * res[k][j])
res[i][j] = res[i][k] * res[k][j];
for (i = 0; i < num; i++)
{
if (res[i][i] > 1.0)
{
cout << "YES" << endl;
return;
}
}
cout << "NO" << endl;
}
int gin(string str, string m[])
{
int i;
for (i = 0; i < num; i++)
if (m[i] == str)
return i;
}
int main()
{
string m[575];
int t;
cin >> t;
while (t--)
{
cin >> num >> mum;
double** dv = new double* [num];
int j;
int i;
for (i = 0; i < num; i++)
cin >> m[i];
for (i = 0; i < num; i++)
{
dv[i] = new double[num];
for (j = 0; j < num; j++)
{
if(i==j)
dv[i][j]=1.0;
else
dv[i][j]=minw;
}
}
for (i = 0; i < mum; i++)
{
double av;
string p;
string q;
cin >> p >> av >> q;
dv[gin(p, m)][gin(q, m)] = av;
}
fuloyide(dv);
}
}
关键路径-STL版
#include<bits/stdc++.h>
using namespace std;
#define P 612
int main()
{
int num;
int ln;
cin >>num;
cin>>ln;
int as[612][612];
int rudu[612];
int i;
int j;
for(i=0; i<P; i++)
for(j=0; j<P; j++)
as[i][j]=0;
for(i=0; i<P; i++)
rudu[i]=0;
for(i = 0; i < ln; i++)
{
int vv1;
int vv2;
int vum;
cin>>vv1>>vv2>>vum;
rudu[vv2]=rudu[vv2]+1;
as[vv1][vv2] = vum;
}
int mysort[P];
queue<int> myq;
for(i = 0; i < num; i++)
{
if(rudu[i] == 0)
{
myq.push(i);
rudu[i] = -1;
}
}
int count;
count=0;
while(!myq.empty())
{
int nono =myq.front();
myq.pop();
mysort[count++] = nono;
for(i = 0; i < num; i++)
{
if(as[nono][i]!=0)
rudu[i]=rudu[i]-1;
if(rudu[i] == 0)
{
myq.push(i);
rudu[i] = -1;
}
}
}
int endd;
int begin;
endd = mysort[num-1];
begin = mysort[0];
int early[P];
int last[612];
for(j=0; j<P; j++)
early[j]=-1;
for(j=0; j<612; j++)
last[j]=99999;
early[begin] = 0;
for(i = 1; i < num; i++)
{
int temp;
int pos;
pos=0;
temp = mysort[i];
for(j = 0; j < num; j++)
{
int numc;
numc=early[j] + as[j][temp];
if(as[j][temp]!=0)
pos = max(numc,pos);
}
early[temp] = pos;
}
for(i = 0; i < num; i++)
{
cout<<early[i]<<" ";
}
cout<<endl;
last[endd] = early[endd];
for(i = num-2; i >= 0; i--)
{
int ppos;
int flag;
ppos=99999;
flag=mysort[i];
for(j = 0; j < num; j++)
{
int mumc;
mumc=last[j] - as[flag][j];
if(as[flag][j]!=0)
ppos = min(mumc,ppos);
}
last[flag] = ppos;
}
for(i = 0; i < num; i++)
{
cout<<last[i]<<" ";
}
cout<<endl;
}