洛谷 1576 最小花费
2016-08-24 23:58
288 查看
http://www.luogu.org/problem/show?pid=1576
把每次扣除的百分数z换成1-z%的样子作边权,即每次要乘的数值,找个乘积最长路最后用100除这个最长路即可。Dijkstra和SPFA应该都可以,然而我只会打SPFA。。。还要注意是双向边。。。
把每次扣除的百分数z换成1-z%的样子作边权,即每次要乘的数值,找个乘积最长路最后用100除这个最长路即可。Dijkstra和SPFA应该都可以,然而我只会打SPFA。。。还要注意是双向边。。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f using namespace std; const int maxn=2010; int head[maxn*maxn],k=1,n,m,a,b; double dis[maxn]; bool vis[maxn]; queue<int> q; struct edge{ int v,next; double w; }e[maxn*maxn]; void addedge(int u,int v,double w){e[k].v=v;e[k].w=w;e[k].next=head[u];head[u]=k++;} double spfa(int s) { memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis)); queue<int> q; dis[s]=1; vis[s]=1; q.push(s); while(!q.empty()) { int t=q.front(); q.pop(); vis[t]=0; for(int i=head[t];i;i=e[i].next) { int v=e[i].v; if(dis[v]<dis[t]*e[i].w) { dis[v]=dis[t]*e[i].w; if(!vis[v]) { vis[v]=1; q.push(v); } } } } return 100/dis[b]; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); addedge(x,y,1-1.0*z/100); addedge(y,x,1-1.0*z/100); } scanf("%d%d",&a,&b); printf("%.8lf",spfa(a)*1.0); return 0; }
相关文章推荐
- 洛谷-1576 最小花费
- 洛谷1576最小花费
- 洛谷P1576 最小花费x
- 洛谷 P1576 最小花费
- P1576 最小花费 洛谷
- 洛谷P1576 最小花费
- luoguP1576 最小花费
- [LUOGU1576] 最小花费
- 题目1086:最小花费
- 九度OJ 1086 最小花费--动态规划
- 洛谷1440 求m区间内的最小值
- 洛谷 P3355 骑士共存问题【最小割】
- hiho1576 子树中的最小权值【dfs序】
- FZU 2197 最小花费 (模拟)
- 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication(最小割)
- FOJ FZU 2197 最小花费【贪心】
- 单源最短路径+最小花费生成树
- poj 3308 最小点权覆盖集, 见 胡驳涛论文里面有讲见图方法 二分图最小权点覆盖 我的想法是一个东西通过两个操作都可以完成,这些操作还可以完成其他的东西,每个操作有一个花费,现在要你选出花费最小的操作。这就是裸的模型
- 洛谷1991 无线通讯网 最小生成树
- 题目1086:最小花费