poj3013Big Chrismas Tree——树转换spfa
2024-08-29 09:03:57
题目:http://poj.org/problem?id=3013
看似生成树,实则最短路,可以将题意转化为点权*根到此点的边权和(最短路使其最小)。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
queue<int>q;
int t,n,m,head[],ct,s[];
bool in[];
ll dis[],INF=1e10,ans;
struct N{
int to,next,w;
N(int t=,int n=,int ww=):to(t),next(n),w(ww) {}
}edge[];
int main()
{
scanf("%d",&t);
while(t--)
{
ct=;
memset(head,,sizeof head);
memset(in,,sizeof in);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&s[i]),dis[i]=INF;
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
edge[++ct]=N(y,head[x],z);head[x]=ct;
edge[++ct]=N(x,head[y],z);head[y]=ct;
}
while(q.size())q.pop();
dis[]=;q.push();in[]=;
while(q.size())
{
int x=q.front();q.pop();
in[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(dis[u]>dis[x]+edge[i].w)
{
dis[u]=dis[x]+edge[i].w;
if(!in[u])in[u]=,q.push(u);
}
}
}
bool flag=;ans=;
for(int i=;i<=n;i++)
{
if(dis[i]==INF)
{
flag=;break;
}
ans+=dis[i]*s[i];
}
if(flag)printf("No Answer\n");
else printf("%lld\n",ans);
}
return ;
}
最新文章
- [笔记]ng2的webpack配置
- 浅谈web语义化
- git 远程版本库,github提供服务原理,git自动更新发送邮件
- amazon o2 - reverse second half linked list
- Maven工程中的右键team
- CXF(2.7.10) - A simple JAX-WS service
- Cocos2d-x手机游戏开发中-组合动作
- Java 8:如何使用流方式查询数据库?
- U3D物理碰撞总结
- 【转载】运维小技巧:使用ss命令代替 netstat
- C# Word常用操作(转)格式设置
- May 31. 2018 Week 22nd Thursday
- js 操作对象 记录
- windows安装mysql8
- laravel 解决session保存不了,取不出的问题
- linux安装memcached安装以及memcache的php扩展
- WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)
- [Selenium.2.Testing.Tools.Beginners.Guide]读书笔记
- iOS UI基础-5.0 QQ框架(Storyboard)
- ci与cd的全称