题目链接:点击打开链接
D题
这道题真神奇
题目大意是说给你n种东西,每种东西有它自己的价值,或者是用两种物品换得某物品,一共有m种换东西的操作,问想换得1物品最少要多少钱。
把每种合成方式建边跑SPFA
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1e5+7;
int n,m;
struct Node
{
int v,w;
Node(){};
Node(int v,int w):v(v),w(w){};
};
int dis[maxn];
vector<Node> vec[maxn];
bool vis[maxn];
void spfa()
{
queue<int> que;
memset(vis,true,sizeof(vis));
for(int i=1;i<=n;i++)
{
que.push(i);
}
while(!que.empty())
{
int node=que.front();
que.pop();
vis[node]=false;
int len=vec[node].size();
for(int i=0;i<len;i++)
{
int v=vec[node][i].v;
int w=vec[node][i].w;
if(dis[w]>dis[v]+dis[node])
{
dis[w]=dis[node]+dis[v];
if(!vis[w])
{
que.push(w);
vis[w]=true;
}
}
}
}
}
int main()
{
freopen("dwarf.in","r",stdin);
freopen("dwarf.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>dis[i];
}
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
vec[b].push_back(Node(c,a));
vec[c].push_back(Node(b,a));
}
spfa();
cout<<dis[1]<<endl;
return 0;
}