1.学习总结 1.1图的思维导图 1.2 图结构学习体会 深度遍历算法:使用递归方式,一个结点再往下一个结点的遍历,不遍历已访问过的结点 广度遍历算法:用队列的方式,将一个结点的周边结点扫入队列中,再按出队的顺序依次访问,重复操作。

 

3

#include <iostream>
#include <fstream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int maxn=10005;
 
int vertices, edges;
vector<int> G[maxn];  //每个vector结构的元素表示:与数组下标代表的结点有边的结点
bool vis[maxn];     //是否访问过
         
int BFS(int v)
{
    for(int i=0; i<maxn; i++)
        vis[i]=false;
    int tail;   //用于记录每层压入时的结点
    int last=v;     //记录每层的最后一个元素:该层压入之后弹出之前更新:last=temp;
    int count=1;
    int level=0;
 
    vis[v]=true;
    queue<int> q;
    q.push(v);
     
    while(!q.empty())
    {
        int x=q.front();    //弹出x
        q.pop();
        for(int j=0; j<G[x].size(); j++) //x的一圈压入队列
        {
            if(!vis[G[x][j]])   //若未被访问过:访问并压入队列
            {
                vis[G[x][j]]=true;              
                q.push(G[x][j]);
                tail=G[x][j];   //记录压入的结点
                count++;
            }   
        }
        if(x==last) //一层全部弹出,准备开始弹下一层:弹出的(x)=当前层最后一个元素(last)
        {
            last=tail;    //一层全都压入完后,更新last
            level++;
        }
        if(level==6)
            break;  
    }
    return count;
}
int main(int argc, char** argv) {   
    int x,y;
    cin >> vertices >> edges;
    //ifstream fin("test.txt");
    //fin >> vertices >> edges;
     
    for(int i=1; i<=edges; i++)
    {
        cin >> x >> y;
        //fin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    for(int j=1; j<=vertices; j++)
    {
        //cout << BFS(j) << endl;
        printf("%d: %.2lf%%\n", j, BFS(j)*1.0/vertices*100.0);  
    }
    return 0;
}

 

 

 

 

 4

#include<iostream>  
    #include<algorithm>  
    using namespace std;  
    const int inf=10000000;  
    const int N=1002;  
    int G[N][N];  
    int d[N];  
    int n,m;  
    bool vis[N]={false};  
    int prim()  
    {  
        fill(d,d+N,inf);  
        d[1]=0;  
        int ans=0;  
        for(int i=1;i<=n;i++)  
        {  
            int u=-1;  
            int min=inf;  
            for(int j=1;j<=n;j++)  
            {  
                if(vis[j]==false&&d[j]<min)  
                {  
                    u=j;  
                    min=d[j];  
                }  
            }  
            if(u==-1)  
            return -1;  
            vis[u]=true;  
            ans+=d[u];  
            for(int v=1;v<=n;v++)  
            {  
                if(vis[v]==false&&G[u][v]!=inf&&G[u][v]<d[v])  
                d[v]=G[u][v];  
             }   
        }   
        return ans;  
     }   
     int main()  
     {  
        int u,v,c;  
        cin>>n>>m;  
        fill(G[0],G[0]+N*N,inf);  
        for(int i=1;i<=m;i++)  
        {  
            cin>>u>>v>>c;  
            G[u][v]=G[v][u]=c;  
        }  
        int ans=prim();  
        if(ans==-1)  
        cout<<"Impossible";  
        else  
        cout<<ans;  
        return 0;  
     } 

 

 

 

 

 

5

#include<cstdio>  
#include<cstring>  
#include<cstdlib>  
#include<cstring>  
#include<cmath>  
#include<stack>  
#include<queue>  
#include<algorithm>  
using namespace std;  
struct node  
{  
    int u,v,w;  
    bool operator < (const node &x)const  
    {  
        return w<x.w;  
    }  
} q[1000002];  
int e=0;  
int fa[100002];  
int findset(int x)  
{  
    return fa[x]!=x?fa[x]=findset(fa[x]):x;  
}  
int main()  
{  
    int n,m;  
    scanf("%d%d",&n,&m);  
    int i,j;  
    for(i=0;i<m;i++)  
        scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].w);  
    sort(q,q+m);  
    for(i=0;i<=n;i++)  
        fa[i]=i;  
    int ans=0;  
    int cnt=0;  
    int f=0;  
    for(int k=0;k<m;k++)  
    {  
        if(findset(q[k].u)!=findset(q[k].v))  
        {  
            fa[fa[q[k].u]]=fa[q[k].v];  
            ans+=q[k].w;  
            cnt++;  
            if(cnt==n-1)  
        {  
                f=1;  
        break;  
        }  
        }  
    }  
    if(f)  
    printf("%d",ans);  
    else  
        printf("Impossible");  
    return 0;  
}  

posted @ 2018-06-18 18:49  哇狗贼  阅读(373)  评论(0编辑  收藏  举报