P1875 佳佳的魔法药水(最短路)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1875 佳佳的魔法药水(最短路)相关的知识,希望对你有一定的参考价值。
P1875 佳佳的魔法药水(最短路)
与一般的最短路的有点不同,转移的时候需要由两个已知状态来转移。
然后开两个数组存答案就行了。
#include <cstdio>
#include <iostream>
using namespace std;
int cost[9999],ans[9999];
int soc[3000][3000];
bool f[3000];
int main()
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&cost[i]),ans[i]=1;
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
soc[a+1][b+1]=soc[b+1][a+1]=c+1;
for(int i=1;i<n;i++)
int maxn=0x7fffffff;
for(int j=1;j<=n;j++)
if(!f[j]&&cost[j]<maxn)
b=j,maxn=cost[j];
f[b]=1;
for(int j=1;j<=n;j++)
if(f[j]&&soc[b][j])
if(cost[b]+cost[j]==cost[soc[b][j]])
ans[soc[b][j]]+=ans[b]*ans[j];
if(cost[b]+cost[j]<cost[soc[b][j]])
cost[soc[b][j]]=cost[b]+cost[j],ans[soc[b][j]]=ans[b]*ans[j];
printf("%d %d",cost[1],ans[1]);
return 0;
dijkstra
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
struct Eg
int u2,v,nxt;
edg[1000001];
int head[1001],tot_edg;
void add_edg(int u1,int u2,int v)
edg[++tot_edg].u2=u2;
edg[tot_edg].v=v;
edg[tot_edg].nxt=head[u1];
head[u1]=tot_edg;
struct P
int cst,ans;
bool v;
ptn[1001];
typedef pair<int,int>pr;
priority_queue<pr,vector<pr>,greater<pr> >q;
int main()
int n;
cin>>n;
for(int i=0; i<n; i++)
cin>>ptn[i].cst;
ptn[i].ans=1;
q.push(make_pair(ptn[i].cst,i));
int u1,u2,v;
while(scanf("%d%d%d",&u1,&u2,&v)!=EOF)
add_edg(u1,u2,v);
if(u1==u2)continue;
add_edg(u2,u1,v);
while(!q.empty())
int c=q.top().first,u=q.top().second;
q.pop();
ptn[u].v=1;
for(int i=head[u]; i; i=edg[i].nxt)
int x=edg[i].u2,v=edg[i].v;
if(ptn[x].v)
if(ptn[v].cst>c+ptn[x].cst)
ptn[v].ans=ptn[u].ans*ptn[x].ans;
ptn[v].cst=c+ptn[x].cst;
q.push(make_pair(ptn[v].cst,v));
else if(ptn[v].cst==c+ptn[x].cst)
ptn[v].ans+=ptn[u].ans*ptn[x].ans;
cout<<ptn[0].cst<<" "<<ptn[0].ans;
return 0;
以上是关于P1875 佳佳的魔法药水(最短路)的主要内容,如果未能解决你的问题,请参考以下文章