SPFA 模板

/*安神的*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 50005;
struct edge{
	int v,next;
	double w;
};
edge e[maxn * 105];
int head[maxn];
int id;
bool v[maxn];
double d[maxn];
void add(int x,int y,double w){
	e[id].v = y;
	e[id].w = w;
	e[id].next = head[x];
	head[x] = id ++;
}
void spfa(int st,int ed){
	memset(v,false,sizeof(v));
	for(int i = 0;i < maxn;i ++){
		d[i] = 0.0;
	}
	queue<int>q;
	q.push(st);
	v[st] = true;
	d[st] = 1;
	while(!q.empty()){
		int tp = q.front();
		q.pop();
		v[tp] = false;
		for(int i = head[tp];i != -1;i = e[i].next){
			if(d[tp] * e[i].w > d[e[i].v]){
				d[e[i].v] = d[tp] * e[i].w;
				if(!v[e[i].v]){
					v[e[i].v] = true;
					q.push(e[i].v);
				}
			}
		}
	}
}
int main(){
	int n;
	while(scanf("%d",&n) != EOF){
		memset(head,-1,sizeof(head));
		id = 0;
		for(int i = 0;i < n;i ++){
			int k;
			scanf("%d",&k);
			for(int j = 0;j < k;j ++){
				int t,td;
				scanf("%d%d",&t,&td);
				add(i,t - 1,(100.0 - td) / 100);
			}
		}
		int st,ed,w;
		scanf("%d%d%d",&st,&ed,&w);
		spfa(st - 1,ed - 1);
		if(d[ed - 1] == 0)printf("IMPOSSIBLE!\n");
		else printf("%.2lf\n",w * (1 - d[ed - 1]));
	}
	return 0;
}

#include <cstdio>
#include <deque>
#include <set>
#include <string>
#include <map>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;

typedef long long LL;
const int maxn = 105;
struct node{
	int v;
	int next;
	int val;
}e[maxn*maxn];
int head[maxn];
int tot;
bool vis[maxn];
int d[maxn];
void init(){
	tot = 0;
	memset(head,-1,sizeof(head));
}
void add(int u,int v,int val){
	e[tot].v = v;
	e[tot].val = val;
	e[tot].next = head[u];
	head[u] = tot ++;
}
void spfa(int st){
	memset(vis,false,sizeof(vis));
	memset(d,0x3f,sizeof(d));
	queue<int> q;
	q.push(st);
	vis[st] = true;
	d[0] = 0;
	while(!q.empty()){
		int u = q.front();
		q.pop();
		vis[u] = false;
		for(int i=head[u];i!=-1;i=e[i].next){
			int v = e[i].v;
			if(d[u]+e[i].val < d[v]){
				d[v] = d[u] + e[i].val;
				if(!vis[v]){
					vis[v] = true;
					q.push(v);
				}
			}
		}
	}
}

int main(){
	int n,m;
	while(~scanf("%d%d",&n,&m)){
		init();
		for(int i=0;i<m;i++){
			int s,e,l;
			scanf("%d%d%d",&s,&e,&l);
			add(s,e,l);
			add(e,s,l);
		}
		spfa(0);
		printf("%d\n",d[1]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值