hsdfz的galaxy(spfa模板)

Description

  某陈和某Y最近对一个游戏着迷.那是Electronic  Arts今年发布的优秀的模拟经营类游戏,Spore.  在Spore中,玩家将经历从单细胞生物到星系的统治者的进化过程,创造并守护你自己的文明.  而某陈在经历了几天*几十分钟/天的游戏后,也终于已经近乎通关了.     目前,某陈统治着银河系中标号1到N的星系,而他的帝国中心,在星系1的某颗美丽的行星之上.如同所有银河系中的文明一样,贸易,发展,结盟,扩张,抵抗Grox[银河系中心的庞大的强悍的恐怖的邪恶帝国]的侵略.  

  某陈有足够的力量,他的疆域蔓延几百个光年.可是Grox异常强大,他们的飞船出现在某陈了解的任何地方,并时常攻击任何位置的某陈和盟友的单位[飞船,建筑,星球,甚至星系].战争在所难免.  某陈将从帝国中心去标号为N的星系,他疆域的边缘,去寻找一个可能存在的通向银河系中心的黑洞.他要计划一条合适的路线.  

  从星系g1到达g2,某陈需要花费c1的代价[主要是燃料,另外还有与沿途Grox的势力作战的花费],c1小于0则是因为这样的星系旅行,会给某陈带来收益[来源于物流差价,以及一些殖民地的税收..].相应地,c2则是代表从星系g2到达g1的代价.据某陈了解,共有M条这样的星系间路径.  为了战备,他需要选择一条总代价最小的路线.  如此水题某陈当然懒得写,交给你了. 

Input

输入文件包括多组数据.  对于每一组数据,第一行有2个整数n,m,如题目描述中的含义,1< =n< =1000,0< =m< =10000.  接下来的m行,每行会有四个整数g1,g2,c1,c2,如题目描述中的含义.0< =g1,g2< =n.输入数据保证所有整数都在[-10000..10000]的范围内.  n=0,m=0标识着输入数据的结束.每个输入文件包含不超过10组数据. 

Output

对于每组输入数据,输出一行,为从星系1到星系N的最小代价的路线的代价.  如果这样的路线不存在,输出'No  such  path'. 

Sample Input

3 2
1 2 2 -1
2 3 0 1
0 0

Sample Output

2
很裸的spfa题,但记得要用spfa判负权环啊!!!!!!!!!!!
  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<queue>
  5 using namespace std;
  6 struct tonod{
  7     int p,next,w;
  8 }g[1000000],v[1000000];
  9 int n,m,father[100000],top,dis[1000000],in[1000000];
 10 bool visit[1000000];
 11 queue <int> q;
 12 void set()
 13 {
 14     for(int i=1;i<=n;i++)
 15     {
 16         father[i]=i;
 17         g[i].next=-1;
 18         dis[i]=9999999;
 19         in[i]=0;
 20     }
 21     dis[1]=0;
 22     top=1;
 23     memset(visit,0,sizeof(visit));
 24     while(!q.empty())
 25     q.pop();
 26     memset(v,0,sizeof(v));
 27 }
 28 void insert(int x,int y,int c)
 29 {
 30     v[top].next=g[x].next;
 31     v[top].p=y;
 32     v[top].w=c;
 33     g[x].next=top;
 34     top++;
 35 }
 36 int getfather(int x)
 37 {
 38     if(father[x]==x)
 39     return x;
 40     int f=getfather(father[x]);
 41     father[x]=f;
 42     return f;
 43 }
 44 void changefather(int x,int y)
 45 {
 46     father[father[y]]=x;
 47 }
 48 void spfa()
 49 {
 50     q.push(1);
 51     visit[1]=1;
 52     in[1]++;
 53     while(!q.empty())
 54     {
 55         int u=q.front();
 56         visit[u]=0;
 57         q.pop();
 58         for(int i=g[u].next;i!=-1;i=v[i].next)
 59         {
 60             int w=v[i].w,t=v[i].p;
 61             if(dis[u]+w<dis[t])
 62             {
 63                 dis[t]=dis[u]+w;
 64                 if(!visit[t])
 65                 {
 66                     visit[t]=1;
 67                     q.push(t);
 68                     in[t]++;
 69                     if(in[t]==n)
 70                     {
 71                         printf("No such path\n");
 72                         return;
 73                     }
 74                 }
 75             }
 76         }
 77     }
 78     printf("%d\n",dis[n]);
 79     return;
 80 }
 81 int main()
 82 {
 83     for(int i=1;i<=11;i++)
 84     {
 85         scanf("%d%d",&n,&m);
 86         if((n==0)&&(m==0))
 87         return 0;
 88         set();
 89         for(int j=1;j<=m;j++)
 90         {
 91             int g1,g2,c1,c2;
 92             scanf("%d%d%d%d",&g1,&g2,&c1,&c2);
 93             insert(g1,g2,c1);
 94             insert(g2,g1,c2);
 95             if(getfather(g1)!=getfather(g2))
 96             changefather(g1,g2);    
 97         }
 98         if(getfather(1)!=getfather(n))
 99         printf("No such path\n");
100         else
101         spfa();
102     }
103 }
View Code

 

 

转载于:https://www.cnblogs.com/mzh2017/p/7806654.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
好的,以下是一个简单的SPFA模板: ``` const int INF = 0x3f3f3f3f; const int MAXN = 1005; vector<pair<int, int>> g[MAXN]; // 存储有向图,pair 中第一个数表示终点,第二个数表示边权 int dist[MAXN]; // 存储源点到每个点的最短距离 bool in_queue[MAXN]; // 标记每个点是否在队列中 void spfa(int s) { // s 表示源点编号 memset(dist, INF, sizeof(dist)); // 初始化 dist 数组为 INF,表示距离无限远 memset(in_queue, 0, sizeof(in_queue)); // 初始化 in_queue 数组为 false,表示所有点都不在队列中 queue<int> q; q.push(s); dist[s] = 0; in_queue[s] = true; while (!q.empty()) { int u = q.front(); q.pop(); // 取出队首元素 in_queue[u] = false; // 标记 u 不在队列中 for (auto v : g[u]) { // 枚举 u 的出边 if (dist[v.first] > dist[u] + v.second) { // 更新 dist[v] dist[v.first] = dist[u] + v.second; if (!in_queue[v.first]) { // 如果 v 不在队列中,则将 v 加入队列 q.push(v.first); in_queue[v.first] = true; } } } } } ``` 解释一下每个部分的作用: 1. 常量 INF 表示距离无限远,MAXN 表示最大点数。 2. g 数组存储有向图,pair 中第一个数表示终点,第二个数表示边权。 3. dist 数组存储源点到每个点的最短距离。 4. in_queue 数组标记每个点是否在队列中。 5. spfa 函数实现 SPFA 算法,s 表示源点编号。 6. 首先将 dist 数组初始化为 INF,表示距离无限远;将 in_queue 数组初始化为 false,表示所有点都不在队列中;将源点 s 加入队列并标记在队列中,并将 dist[s] 初始化为 0。 7. 进行队列操作:取出队首元素 u,枚举 u 的出边,如果可以通过 u 更新 dist[v] 的值,则更新 dist[v] 并将 v 加入队列。当队列为空时,SPFA 算法结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值