六度空间————广搜
#include <iostream>
#include <queue>
#include <string.h>
#include <iomanip>
#define N 1010
using namespace std;
struct node{int top,len;};
int mapp[N+10][N+10],mark[N],n,m,sum;
int bfs(int i){
sum=0;
queue<node>q;
node t1,t2;int j;
t1.top=i; t1.len=0; //mark[i]=1;
q.push(t1);
while(!q.empty()){
t1=q.front();
q.pop();
mark[t1.top]=1;
if(t1.len<=6)
++sum;
else
break;
for(j=1;j<=n;j++)
if(mapp[t1.top][j]==1&&mark[j]==0){
t2.top=j;
t2.len=t1.len+1;
mark[t2.top]=1;
q.push(t2);
}
}
return sum;
}
int main()
{
int a,b,i,x;
cin>>n>>m;
memset(mapp,0,sizeof(mapp));
for(i=0;i<m;i++){
cin>>a>>b;
mapp[a][b]=mapp[b][a]=1;
}
double y=0.00;
for(i=1;i<=n;i++){
memset(mark,0,sizeof(mark));
x=bfs(i);
y=x*100.0/n;
cout<<i<<": "<<fixed<<setprecision(2)<<y<<"%"<<endl;
}
return 0;
}
地下迷宫探索————深搜
#include <iostream>
#include <algorithm>
#include <string.h>
#define N 1100
using namespace std;
int mapp[N][N],mark[N],n,m,s,fflag=0;
void dfs(int ss){
int j;
mark[ss]=1;
cout<<ss<<" ";
for(j=1;j<=n;j++)
if(mark[j]==0&&mapp[j][ss]==1){
dfs(j);
if(ss==s) cout<<ss;
else cout<<ss<<" ";
}
}
int main()
{
int i,j,a,b,flag=0;
cin>>n>>m>>s;
memset(mark,0,sizeof(mark));
for(i=0;i<m;i++){
cin>>a>>b;
mapp[a][b]=mapp[b][a]=1;
}
dfs(s);
for(i=1;i<=n;i++)
if(mark[i]!=1)
flag=1;
if(flag==1)
cout<<" 0"<<endl;
return 0;
}
哈利·波特的考试————最短路
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#define MAXINT 32767
#define MAXNUM 600
using namespace std;
int n,m;
int dist[MAXNUM],A[MAXNUM][MAXNUM],S[MAXNUM];
void Dijkstra(int v0){
int i,j;
memset(S,0,sizeof(S));
for(i=1;i<=n;i++)
dist[i]=A[v0][i];
dist[v0]=0; S[v0]=1;
for(i=1;i<n; i++){
int mindist=MAXINT,u=-1;
for(j=1;j<=n;++j)
if((!S[j])&&dist[j]<mindist){
mindist=dist[j];
u=j;
}
S[u]=1;
if(u!=-1){
for(j=1;j<=n;j++)
if((!S[j])&&A[u][j]<MAXINT&&dist[u] + A[u][j]<dist[j])
dist[j]=dist[u]+A[u][j];
}
}
}
int main()
{
int a,b,t,i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
A[i][j]=MAXINT;
for(i=0;i<m;i++){
cin>>a>>b>>t;
A[a][b]=A[b][a]=t;
}
int l=0,p=0,maxx=MAXINT;
for(i=1;i<=n;i++){
Dijkstra(i);
//对每个点求最短路,然后求距离最小的一个
sort(dist+1,dist+n+1);
if(dist[n]==MAXINT) l++;//若存在距离等于无穷大的,则说明这个不行
//求最短距离并更新编号
if(dist[n]<maxx){
maxx=dist[n];
p=i;
}
}
if(l==n)
cout<<"0"<<endl;
else
cout<<p<<" "<<maxx<<endl;
return 0;
}
旅游规划—————最短路
关于最短路的更多习题点击打开链接
#include <iostream>
#include <queue>
#include <stdio.h>
#include <string.h>
#define MAXINT 32767
#define MAXNUM 600
using namespace std;
int n,m,start,endd;
int dist[MAXNUM],distmoner[MAXNUM],prev[MAXNUM],A[MAXNUM][MAXNUM],S[MAXNUM],money[MAXNUM][MAXNUM];
void Dijkstra(int v0)
{
int i,j;
memset(S,0,sizeof(S));
for(int i=0;i<n;i++){
dist[i]=A[v0][i];
distmoner[i]=money[v0][i];
}
dist[v0]=0; distmoner[v0]=0; S[v0]=1;
for(i=1; i<n; i++){
int mindist=MAXINT,u=-1;
for(j=0;j<n;++j)
if((!S[j]) && dist[j]<mindist){
u = j;
mindist = dist[j];
}
S[u]=1;
if(u!=-1){
for(j=0; j<n; j++)
if((!S[j]) && A[u][j]<MAXINT){
if(dist[u]+A[u][j]==dist[j]){//若满足距离最小,则更新钱让花费最小
if(distmoner[j]>distmoner[u]+money[u][j])
distmoner[j]=distmoner[u]+money[u][j];
}
if(dist[u] + A[u][j] < dist[j]){//钱随着距离更新
dist[j]=dist[u]+A[u][j];
distmoner[j]=distmoner[u]+money[u][j];
}
}
}
}
}
int main()
{
int a,b,t,r,i,j;
cin>>n>>m>>start>>endd;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A[i][j]=MAXINT;
for(i=0;i<m;i++){
cin>>a>>b>>t>>r;
A[a][b]=A[b][a]=t;
money[a][b]=money[b][a]=r;
}
Dijkstra(start);
cout<<dist[endd]<<" "<<distmoner[endd];
return 0;
}
畅通工程之最低成本建设问题——————最小生成树
关于最小生成树的更多习题点击打开链接
#include <iostream>
#include <string.h>
#include <algorithm>
#define N 1100
#define Y 1100
using namespace std;
struct node{
int a; int b; int c;
}mapp[N*3];
int com(struct node t1,struct node t2){
return t1.c<t2.c;
}
int fffa[N];
int findfa(int x){
if(x!=fffa[x])
fffa[x]=findfa(fffa[x]);
return fffa[x];
}
int main()
{
int n,m,i,result=0;
cin>>n>>m;
for(i=1;i<=n;i++)
fffa[i]=i;
for(i=1;i<=m;i++)
cin>>mapp[i].a>>mapp[i].b>>mapp[i].c;
sort(mapp+1,mapp+m+1,com);
int fa,fb;
for(i=1;i<=m;i++){
fa=findfa(mapp[i].a);
fb=findfa(mapp[i].b);
if(fa!=fb){
fffa[fa]=fb;
result+=mapp[i].c;
n--;
}
}
if(n>1)
cout<<"Impossible"<<endl;
else
cout<<result<<endl;
return 0;
}