山东理工大学2020年全国天梯赛赛前个人专题强化赛---C(最短路)

山东理工大学2020年全国天梯赛赛前个人专题强化赛---C(最短路)_第1张图片
在这里插入图片描述
旅游规划这个题,其实用floyd也可以做,而且代码看起来更舒服,先给一个floyd的代码(非全原创,侵删),但要注意,由于floyd确实多算了很多无用的数据,如果卡你时间,floyd是过不了的。

#include 
using namespace std;
#define INF 0x3f3f3f3f

int node [505][505];
int dis[505][505];
int main()
{
    int n,m,s,d,i,j,k,x,y,q,w;
    cin>>n>>m>>s>>d;
    memset(dis,INF,sizeof(dis));
    memset(node,INF,sizeof(node));
    for(int i=0;inode[i][k]+node[k][j]||(node[i][j]==node[i][k]+node[k][j]&&dis[i][j]>dis[i][k]+dis[k][j]))
                {
                    node[i][j] = node[i][k]+node[k][j];
                    dis[i][j] = dis[i][k]+dis[k][j];
                }
            }
        }
    }
    printf("%d %d\n",node[s][d],dis[s][d]);
    return 0;
}

dijkstra算法(非全原创,侵删)

#include 
#define INF 0x3f3f3f3f;
using namespace std;

int n,m,s,d;
int G[505][505];
int a[505][505];
int lowcost[505];
int fee[505];
int vis[505];
void dij()
{
    for(int i=0;ifee[k]+a[k][i])
                    {
                        fee[i]=fee[k]+a[k][i];
                    }
                }
                else if(vis[i]==0&&lowcost[i]>lowcost[k]+G[k][i])
                {
                    lowcost[i]=lowcost[k]+G[k][i];
                    fee[i]=fee[k]+a[k][i];
                }
        }
    }
}


int main()
{
    scanf("%d %d %d %d",&n,&m,&s,&d);
    for(int i=0;i

山东理工大学2020年全国天梯赛赛前个人专题强化赛---C(最短路)_第2张图片
在这里插入图片描述
城市间紧急救援这个题我认为比上面那个考的更加全面和具体,比如他要求输出路径,要求输出最短路径条数,比起上个题,此题更有挑战性,做出来收获更大。
代码是我在网上找的,因为很好,比我自己的好太多,所以我只改了一个变量名,侵删。

#include
using namespace std;
const int inf=0x3f3f3f3f;

int a[1001][1001];
int cnt[1001],vis[1001]= {0},cf[1001],ccf[1001],pre[1001];
//最短路径条数,各城市是否经过,各城市的救援队数量,到达该城市时所召集的所有救援队数量,到达该城市前经过的城市编号
int n,m,s,d;
int Dijkstra()
{
    cnt[s]=1;//开始时路径条数为1
    vis[s]=1;//当前在出发城市
    for(int i=0; ia[s][f]+a[f][j]) //到达某一城市的最短路径
            {
                a[s][j]=a[s][f]+a[f][j];//最短路径更新
                pre[j]=f;//记录上一个城市编号
                cnt[j]=cnt[f];//拷贝到达上一个城市时的最短路径条数
                ccf[j]=ccf[f]+cf[j];//到达某城市召集的全部救援队数量
            }
            else if(vis[j]==0&&a[s][j]==a[s][f]+a[f][j]) //发现其他的最短路径
            {
                cnt[j]=cnt[j]+cnt[f];//更新到达当前城市时的最短路径条数
                if(ccf[j]>n>>m>>s>>d;
    for(int i=0; i>cf[i];
        ccf[i]=cf[i];
        cnt[i]=1;
    }
    for(int i=0; i>q>>w>>e;
        a[q][w]=a[w][q]=e;
    }
    Dijkstra();
    cout<=0; i--)
        cout<<" "<

你可能感兴趣的:(C/C++/数据结构)