2022.2.13 练习 PAT 甲 1003 Emergency (原题链接)
写错一个变量名,半天找不到错,我的母语是无语。
注:本题是无向图情况
#include <bits/stdc++.h>
using namespace std;
const int MAX_NUM=510;
const int INF=0x3fffffff;
int n,m,C1,C2;
int weight[MAX_NUM];
int w[MAX_NUM]={0};//从起点到u点收集到的最大物资
int d[MAX_NUM];//起点到各点的最短路径长度
int visit[MAX_NUM]={0};//标记是否已经访问
int num[MAX_NUM]={0};//从起点到u的最短路径条数
struct Node
{
int v;
int data;
Node(int _v,int _data)
{
v=_v;
data=_data;
}
};
vector<Node> G[MAX_NUM];
void Dijkstra(int s)
{
fill(d,d+MAX_NUM,INF);
num[s]=1;
w[s]=weight[s];
d[s]=0;
for(int i=0;i<n;i++)
{
int u=-1,MIN=INF;
for(int j=0;j<n;j++)
{
if(visit[j]==0 && d[j]<MIN )
{
u=j;
MIN=d[j];
}
}
if(u==-1)
return ;
visit[u]=1;
for(int j=0;j<G[u].size();j++)
{
int v=G[u][j].v;;
if(visit[v]==0)
{
if(d[u]+G[u][j].data<d[v])
{
d[v]=d[u]+G[u][j].data;
num[v]=num[u];
w[v]=w[u]+weight[v];
}
else if(d[u]+G[u][j].data==d[v])
{
num[v]+=num[u];
if(w[u]+weight[v]>w[v])
{
w[v]=w[u]+weight[v];
}
}
}
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m>>C1>>C2;
for(int i=0;i<n;i++)
{
cin>>weight[i];
}
while(m--)
{
int c1,c2,l;
cin>>c1>>c2>>l;
G[c1].push_back(Node(c2,l));
G[c2].push_back(Node(c1,l));
}
Dijkstra(C1);
cout<<num[C2]<<" "<<w[C2]<<endl;
return 0;
}