正式入坑 PAT ,这道题我的解是东拼西凑吧,用了 http://blog.csdn.net/apie_czx/article/details/45310675 这个大佬的思路,然后刘汝佳的模板
在此奉上代码
#include
#include
#include
#include
using namespace std;
const int maxn=500+5;
const int INF=100000000;
struct E{
int from,to,weight;
E(int from,int to,int weight):from(from)
,to(to),weight(weight){}
bool operator <(const E &rhs)const{
return this->weight>rhs.weight;
}
};
struct H{
int u,dis;
H(int u,int dis):
u(u),dis(dis){}
bool operator <(const H &rhs) const{
return this->dis>rhs.dis;
}
};
vector<int> G[maxn];
vector<E> edges;
int dis[maxn];
int mark[maxn];
int paths[maxn];
int nums[maxn];
int all_nums[maxn];
void addEdge(int from,int to,int weight)
{
edges.push_back(E(from,to,weight));
int ss=edges.size();
G[from].push_back(ss-1);
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif
int n,m,from,to;
scanf("%d%d%d%d",&n,&m,&from,&to);
edges.clear();
for(int i=0;i<n;i++)
{
G[i].clear();
dis[i]=INF;
mark[i]=0;
paths[i]=0;
scanf("%d",&nums[i]);
all_nums[i]=0;
}
int c1,c2,w;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&c1,&c2,&w);
addEdge(c1,c2,w);
addEdge(c2,c1,w);
}
dis[from]=0;
paths[from]=1;
all_nums[from]=nums[from];
priority_queue<H> qq;
qq.push(H(from,dis[from]));
while(!qq.empty())
{
H h= qq.top();
qq.pop();
int u=h.u;
if(mark[u])
continue;
mark[u]=true;
int old_d=h.dis;
for(int i=0;i<G[u].size();i++)
{
E new_E=edges[G[u][i]];
if(dis[new_E.to]>new_E.weight+old_d )
{
paths[new_E.to]=paths[u];
dis[new_E.to]=new_E.weight+old_d;
all_nums[new_E.to]=nums[new_E.to]+all_nums[u];
}
else if(dis[new_E.to]==new_E.weight+old_d )
{
paths[new_E.to]+=paths[u];
if(all_nums[new_E.to]<all_nums[u]+nums[new_E.to])
{
all_nums[new_E.to]=all_nums[u]+nums[new_E.to];
}
}
qq.push(H(new_E.to,dis[new_E.to]));
}
}//while
cout<<paths[to]<<" "<<all_nums[to]<<endl;
return 0;
}
// priority_queueqq;
// qq.push(E(2,3,4));
// qq.push(E(1,2,2));
// qq.push(E(4,1,3));
// while(!qq.empty())
// {
// cout<
// qq.pop();
// }