图算法

今天,总结总结最近学的图论算法
一:最短路
1:dijkstra单源最短路

#include <stdio.h>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <set>
#include <vector>
#define maxn 1000
#define INF 0x3f3f3f3f
using namespace std;

int cost[maxn][maxn];           //从  I—>J 的路径长度
int V;                          //点的个数
bool used[maxn];                //这个点是否确定下来了
int d[maxn];                    //这个点到单源点的距离

void dijkstra(int x)
{   fill(d,d+V,INF);
    fill(used,used+V,false);    //准备工作
    d[x] = 0;
    int c;
    while(1){
    c=-1;
    for(int i=0;i<V;i++)    if(!used[i]&&(c==-1||d[i]<d[c])) c=i;       //在所有的未确定点中  确定当距离单源点的最小点

    if(c==-1) break;
    used[c]=true;

    for(int j=0;j<V;j++)
    {
        d[j]=min(d[j],d[c]+cost[c][j]);
    }

    }
}
int main()
{
    cout<<"请输入多少个点:"<<endl;
    cin>>V;
    int Edge;
    cout<<"请输入总共有多少个边:"<<endl;
    cin>>Edge;
    cout<<"下面进行边边信息的输入."<<endl;
    int qi,zhong,zhi;
    cout<<"起点,终点,两点之间路径值:"<<endl;

    for(int i=0;i<V;i++)
        for(int j=0;j<V;j++)
            cost[i][j] = INF;
    for(int i=0;i<Edge;i++)
    {

        cin>>qi>>zhong>>zhi; 
        cost[qi][zhong]=zhi;
        cost[zhong][qi]=zhi;
    }
    dijkstra(1);
    for(int i=0;i<V;i++)
    {
        cout<<"0->"<<i<<" distance:"<<d[i]<<endl;
    }


    return 0;
}

2 floyd算法
任意两点之间的最短路径

#include <stdio.h>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <set>
#include <vector>
#define maxn 1000
#define INF 0x3f3f3f3f
using namespace std;
int main()
{

    int Edge;

    while(cin>>V>>Edge){
    if(V==0&&Edge==0)break;
    int qi,zhong,zhi;


    for(int i=0;i<V;i++)
        for(int j=0;j<V;j++)
            cost[i][j] = INF;
    for(int i=0;i<Edge;i++)
    {

        cin>>qi>>zhong>>zhi;
        cost[qi-1][zhong-1]=zhi;
        cost[zhong-1][qi-1]=zhi;        //这一行代码必不可少
    }
    for(int k=0;k<V;k++)
        for(int i=0;i<V;i++)
        for(int j=0;j<V;j++)
    {
        if(cost[i][j]>cost[i][k]+cost[k][j])
        {
            cost[i][j]=cost[i][k]+cost[k][j];
        }
    }
    cout<<cost[0][V-1]<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值