Dijkstra's algorithm

迪科斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题。

Dij算法c++实现 复杂度O(V²)


// 邻接矩阵
typedef struct _graph
{
    char vexs[MAX];       // 顶点集合
    int vexnum;           // 顶点数
    int edgnum;           // 边数
    int matrix[MAX][MAX]; // 邻接矩阵
}Graph, *PGraph;


int mp[maxn][maxn]; //邻接矩阵
int dis[maxn];      //起始点到第i点的最短距离
bool visit[maxn];
int n,m;            //顶点数,边数
    void Dijkstra( int s )
    {
        int i,v,u;
        for( i=1; i<=n; ++i ) //初始化
        {
            visit[i]=false;
            dis[i]=mp[1][i];
        }
      dis[s]=0;
      while( true )
      {
            v=-1;
            for( u=1; u<=n; ++u )
                if( !visit[u] && ( v==-1 || dis[u]




堆优化





PAT(A) 1003 给定两点的最小路径数

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

int weight[501],visit[501];
int map1[501][501];
int mind,cnt,maxt;    //最小距离,最短路径个数,最大权值


void init(int n){
    int i,j;
    for(int i=0;imind) return;
    
    for(i=0;id){
            map1[x][y]=map1[y][x]=d;
        }
    }
    dfs(c1,c2,0,weight[c1],n);
    
    cout<





BFS

1094. The Largest Generation (25)

#include 
#include 

struct Person{
    int id;
    int children[100]; //记录其child的ID
    int child_count; //有几个child
    int generation; //此人属于第几代
    Person():id(0), child_count(0), generation(0){}
};

int main(){
    int M, N;
    int counts[101] = {0}; //用来记录每一代分别有多少人
    scanf("%d%d", &N, &M);
    Person persons[101];

    for(int i = 0;i < M; i++){
        int id, count;
        scanf("%d%d", &id, &count);
        persons[id].id = id;
        persons[id].child_count = count;
        for(int j = 0; j < count; j++){
            scanf("%d", &(persons[id].children[j]));
        }
    }
    //此前的代码都是输入信息

    std::queue q; //q用来决定遍历的顺序
    q.push(01);
    persons[01].generation = 1;
    while(!q.empty()){
        int parent = q.front();
        counts[persons[parent].generation] ++; //这一代又多了一个人
        q.pop();
        for(int i = 0; i < persons[parent].child_count; i++){
            int child = persons[parent].children[i]; //把它的子女放入queue
            q.push(child);
            persons[child].generation = persons[parent].generation + 1; //child的代数 = parent的代数+1
        }
    }
    int max = 0, index = 1;
    for(int i = 1; i < 101; i++){
        if(counts[i] > max){
            max = counts[i];
            index = i;
        }
    }
    printf("%d %d\n", max, index);
    return 0;
}


你可能感兴趣的:(图)