1.数据结构上的一种方法
#include<bits/stdc++.h>
using namespace std;
const int maxn=550;
const int inf=0x3f3f3f3f;
int n,m,s,d;
int D[maxn]; //源点到其他各点的最短路径长度
int P[maxn]; //存储走过的地点
int vis[maxn]; //标记是否进入
int num[maxn]; //各个地点救援队人数
int edge[maxn][maxn]; //各点之间的长度存储
vector<int>ans,pre;
int cnt,Maxv;
void Dijkstra()
{
for(int i=0;i<n;i++) //因为从m点开始,所以先把最短路径和前驱点初始化
{
D[i]=edge[s][i];
P[i]=s;
}
D[s]=0;
vis[s]=1;
P[s]=-1; //前驱点
for(int i=0;i<n;i++)
{
int min=inf+1; //为了将没有路径的最后选中
int x=-1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&D[j]<min)
{
min=D[j];
x=j;
}
}
vis[x]=1;
for(int j=0;j<n;j++) //更新没进入的节点的长度
{
if(!vis[j]&&D[x]+edge[x][j]<D[j])
{
D[j]=D[x]+edge[x][j];
P[j]=x;
}
}
}
/*
for(int i=0;i<n;i++)
{
printf("%d:%d",D[i],i);
int pre=P[i];
while(pre!=s&&pre!=-1)
{
printf(" <- %d",pre);
pre=P[i];
}
printf(" <- 0");
printf("\n");
}*/
}
void dfs(int x,int w)
{
if(x==d)
{
if(w>Maxv)
{
Maxv=w;
ans=pre;
}
cnt++;
return;
}
for(int i=0;i<n;i++)
{
if(edge[x][i]&&!vis[i]&&D[i]==D[x]+edge