1003 Emergency (25)

本文介绍了一个基于图论的程序设计问题,该程序通过计算图中两点间的最短距离来找出从起点到终点的最优路径,并在此过程中最大化收集沿途的资源数量。文章详细展示了算法的实现过程,包括初始化图数据结构、计算最短路径长度以及递归寻找最大资源数量的方法。
摘要由CSDN通过智能技术生成

这个程序抄来的。

#include <iostream>
#include <vector>
using namespace std;
class CA
{
public:
enum{N=500,INF=0x6FFFFFFF};
void run();
void getshortestlen();
void getmaxhands(int k,int curhands);
private:
int n,m,sv,dv;
int hands[N];
int dist[N][N];
int shortestlen,shortestpathnum,maxhands;
vector<int> posipath[N];
};
void CA::getmaxhands(int k,int curhands)
{
if(k==sv)
{
shortestpathnum++;
if(curhands+hands[k]>maxhands) maxhands=curhands+hands[k];
}
int i;
for(i=0;i<posipath[k].size();i++)
{
getmaxhands(posipath[k][i],curhands+hands[k]);
}
}
void CA::getshortestlen()
{
shortestlen=-1;
bool visited[N];
int d[N];
fill_n(visited,n,false);
int i;
for(i=0;i<n;i++) d[i]=dist[sv][i];
d[sv]=0;
while(1)
{
int k=-1;
for(i=0;i<n;i++)
{
if(visited[i]) continue;
if(k==-1||d[i]<d[k]) k=i;
}
if(k==-1) break;
if(k==dv)
{
shortestlen=d[k];
break;
}
visited[k]=true;
for(i=0;i<n;i++)
{
if(visited[i]) continue;
if(d[i]>d[k]+dist[k][i])
{
d[i]=d[k]+dist[k][i];
posipath[i].clear();
posipath[i].push_back(k);
}
else if(d[i]==d[k]+dist[k][i])
{
posipath[i].push_back(k);
}
}
}
}
void CA::run()
{
shortestpathnum=0;
maxhands=0;
int i,v1,v2,w;
cin>>n>>m>>sv>>dv;
for(i=0;i<n;i++) cin>>hands[i];
fill_n((int*)dist,N*N,INF);
for(i=0;i<m;i++) 
{
cin>>v1>>v2>>w;
dist[v1][v2]=w;
dist[v2][v1]=w;
}
getshortestlen();
getmaxhands(dv,0);
printf("%d %d\n",shortestpathnum,maxhands);
}


int main()
{
//freopen("test.in","r",stdin);
CA *a=new CA;
a->run();
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值