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 佳佳的魔法药水(最短路)的主要内容,如果未能解决你的问题,请参考以下文章

P1875 佳佳的魔法药水

洛谷—— P1875 佳佳的魔法药水

洛谷—— P1875 佳佳的魔法药水

[无聊测试赛] T8 佳佳的魔法药水

佳佳的魔法药水

vijos:P1285佳佳的魔法药水