ACM训练日志22

   昨天的训练赛出了俩题,水题。但是出的比较慢,俩题代码50行左右。还有一题BFS的裸题,但是没出,考虑用的DFS,没有写出来,出现问题。看了riba的2016年蓝桥杯C++组的几个DFS的题目,基本裸题能直接做。最近看的图论里一个Dijkstra算法,是一个较为典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。找的大佬的解法:在这里插入图片描述在这里插入图片描述
附上代码:

//STL代码
struct edge{int to, cost;};//图的边  
typedef pair<int,int> P;//保存的结果,first为最短距离,second为相应顶点  
  
int V;  
vector<edge> G[MAX_V];  
int d[MAX_V];  
  
void dijkstra(int s){  
    //通过制定greater<P>参数,堆按照first从小到大的顺序取出值
    priority_queue<P,vector<P>,greater<P>> que;  
    fill(d,d+V,INF);  
    d[s]=0;  
    que.push(P(0,s));  
  
    while(!que.empty()){  
        P p=que.top(); que.pop();  
        int v=p.second;  
        for(int i=0;i<G[v].size;i++){  
            edge e=G[v][i];  
            if(d[e.to]>d[v]+e.cost){  
                d[e.to]=d[v]+e.cost;  
                que.push(P(d[e.to],e.to));  
            }  
        }  
    }  
}

//代码实现模板
#define INF 0x3f3f3f3f
#define MAX 101

int dis[MAX],vis[MAX];
int mp[MAX][MAX];

int dijkstra(int s,int e)
{
    memset(vis,0,sizeof(vis));
    for(int i=1; i<=e; i++)
        dis[i]=mp[s][i];
    dis[s]=0;
    vis[s]=1;
    while(true){
        int min=INF;
        int p;
        for(int i=1; i<=e; i++){
            if(!vis[i] && dis[i]<min){
                min=dis[i];
                p=i;
            }
        }
        if(min==INF)
            break;
        vis[p]=1;
        for(int i=1; i<=e; i++){
            if(!vis[i] && dis[i]>min+mp[p][i])
                dis[i]=min+mp[p][i];
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值