新手,如有bug请斧正。
就是pta 1003 energency
输入:每个输入文件都包含一个测试用例。对于每个测试用例,第一行包含 4 个正整数:N (≤500) - 城市的数量(城市从0到N−1),M- 道路数量,C1和C2- 您当前所在的城市和您必须保存的城市。下一行包含N整数,其中我-th 整数是我-第一个城市。然后M线条跟随,每条描述一条有三个整数的道路c1,c2和L,这是一对由道路连接的城市和该道路的长度,分别。保证至少存在一条路径C1自C2
输出:对于每个测试用例,在一行中打印两个数字:两者之间不同最短路径的数量C1和C2,以及您可以聚集的最大救援队数量。一行中的所有数字必须由一个空格分隔,并且行尾不允许有额外的空格。
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include <iomanip>
#include<vector>
#include<cstdlib>c++
#include<algorithm>
#include<math.h>
void dijkstra(int x,int y);
const int INF=1e6;
struct edge{
int w;
int e;
int next;
}edge[1010];
struct head{
int w;
int n;
}head [510];
int path[510],dist[510],num[510];
bool fin[510];
using namespace std;
int main()
{
int n,i=0,m,c1,c2,j=0,cnt=0,t;
cin>>n>>m>>c1>>c2;
for(i=0;i<n;i++){
cin>>head[i].w;
head[i].n=-1;
fin[i]=false;
}
for(i=0;i<m;i++){
cin>>j>>edge[cnt].e>>edge[cnt].w;
t=edge[cnt].e;
edge[cnt].next=head[j].n;
head[j].n=cnt++;
edge[cnt].e=j;
edge[cnt].w=edge[cnt-1].w;
edge[cnt].next=head[t].n;
head[t].n=cnt++;
}
dijkstra(c1,n);
//for(i=0;i<n;i++){
printf("%d %d\n",path[c2],num[c2]);
//}
return 0;
}
void dijkstra(int x,int y){
int i;
fin[x]=true;
for(i=0;i<y;i++){
path[i]=1;
dist[i]=INF;
}
dist[x]=0;
for(i=head[x].n;i!=-1;i=edge[i].next){
dist[edge[i].e]=edge[i].w;
num[edge[i].e]=head[x].w+head[edge[i].e].w;
}
num[x]=head[x].w;
path[x]=1;
int j=0,t;
for(i=0;i<y;i++){
int min=INF,k=0;
for(j=0;j<y;j++){
if(j==x) continue;
if(min>dist[j]&&!fin[j]){
min=dist[j];
k=j;
}
}
fin[k]=true;
for(j=head[k].n;j!=-1;j=edge[j].next){
t=edge[j].e;
if(dist[t]==dist[k]+edge[j].w&&!fin[t]){
//if(path[t]<path[k])
path[t]=path[k]+path[t];
if(num[t]<num[k]+head[t].w)num[t]=num[k]+head[t].w;
}
if(dist[t]>dist[k]+edge[j].w&&!fin[t]){
dist[t]=dist[k]+edge[j].w;
num[t]=num[k]+head[t].w;
path[t]=path[k];
}
}
}
}