六度空间 地下迷宫探索 哈利·波特的考试 旅游规划 畅通工程之最低成本建设问题

六度空间————广搜

点击打开链接

 

#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;
}

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值