【Heap-dijkstra】Gym - 100923B - Por Costel and the Algorithm
algoritm.in / algoritm.out
Even though he isn't a student of computer science, Por Costel the pig has started to study Graph Theory. Today he's learning about Bellman-Ford, an algorithm that calculates the minimum cost path from a source node (for instance, node 1) to all the other nodes in a directed graph with weighted edges. Por Costel, utilizing his scarce programming knowledge has managed to scramble the following code in C++, a variation of the Bellman-Ford algorithm:
You can notice a lot of deficiencies in the above code. In addition to its rudimentary documentation, we can see that Por Costel has stored this graph as an array of edges (the array ). An edge is stored as the triplet
signifying an edge that spans from
to
and has weight
. But even worse is the fact that the algorithm is SLOW!
As we want our hooved friend to walk away with a good impression about computer science, we want his code to execute as FAST as possible. In order to do so, we can modify the order of edges in the array so that the while loop executes a small number of times.
Given a directed graph of nodes and
edges, you are asked to produce an ordering of the edges such that the Bellman-Ford algorithm written by Por Costel should finish after at most two iterations of the while loop(that is, the program should enter the while loop at most twice).
Input
The first line of the file algoritm.in will contain an integer
, the number of test cases.
Each of the test cases has the following format: on the first line, there are two numbers
and
(
), the number of nodes and the number of edges in the graph respectively.
The next lines describe the edges, each containing three integers
signifying there is an edge from node
to node
with weight
(
)
It is guaranteed that node has at least one outgoing edge.
The graph may contain self loops and/or multiple edges.
Output
The output file algoritm.out should contain lines representing the answers to each test case.
For each test case you should output a permutation of numbers from to
, representing the order of the edges you want in Por Costel's array of edges
.
The edges are considered indexed by the order in which they are given in the input (the -th edge read is the edge with index
).
If there are multiple solutions, you are allowed to print any of them.
Example
- 1
4 4
1 2 1
3 4 2
2 3 3
1 3 1
- 1 4 2 3
题意就是一个傻逼写了个最短路,问你怎么将输入的graph的边排序,使得他的最短路只跑一次。
显然先跑在最短路径树上的边,再跑其他的边,就只需要一次了。
必须用堆dijkstra,好像卡了spfa。
- #include<cstdio>
- #include<queue>
- #include<cstring>
- using namespace std;
- typedef long long ll;
- #define INF 1000000000007ll
- #define N 100010
- #define M 200010
- struct Point{ll d;int u;
- Point(const ll &X,const int &Y){d=X;u=Y;}
- Point(){}};
- int T,n,m;
- int cnt;
- bool operator < (Point a,Point b){return a.d>b.d;}
- priority_queue<Point>q;
- int v[M],__next[M],first[N],w[M],e;
- int fa[N],fam[N];
- ll d[N];
- void AddEdge(int U,int V,int W)
- {
- v[++e]=V;
- w[e]=W;
- __next[e]=first[U];
- first[U]=e;
- }
- bool vis[N],intree[M];
- void dijkstra(int S)
- {
- for(int i=1;i<=n;++i) d[i]=INF;
- d[S]=0; q.push(Point(0,S));
- while(!q.empty())
- {
- Point x=q.top(); q.pop();
- if(!vis[x.u])
- {
- vis[x.u]=1;
- for(int i=first[x.u];i;i=__next[i])
- if(d[v[i]]>d[x.u]+(ll)w[i])
- {
- d[v[i]]=d[x.u]+(ll)w[i];
- fa[v[i]]=x.u;
- intree[fam[v[i]]]=0;
- fam[v[i]]=i;
- intree[i]=1;
- q.push(Point(d[v[i]],v[i]));
- }
- }
- }
- }
- void dfs(int U)
- {
- for(int i=first[U];i;i=__next[i])
- if(intree[i])
- {
- ++cnt;
- printf("%d%c",i,cnt==m ? '\n' : ' ');
- dfs(v[i]);
- }
- }
- int main()
- {
- freopen("algoritm.in","r",stdin);
- freopen("algoritm.out","w",stdout);
- //freopen("b.in","r",stdin);
- int x,y,z;
- scanf("%d",&T);
- for(;T;--T)
- {
- cnt=e=0;
- memset(v,0,sizeof(v));
- memset(w,0,sizeof(w));
- memset(__next,0,sizeof(__next));
- memset(first,0,sizeof(first));
- memset(fa,0,sizeof(fa));
- memset(fam,0,sizeof(fam));
- memset(d,0,sizeof(d));
- memset(vis,0,sizeof(vis));
- memset(intree,0,sizeof(intree));
- scanf("%d%d",&n,&m);
- for(int i=1;i<=m;++i)
- {
- scanf("%d%d%d",&x,&y,&z);
- AddEdge(x,y,z);
- }
- dijkstra(1);
- dfs(1);
- for(int i=1;i<=m;++i)
- if(!intree[i])
- {
- ++cnt;
- printf("%d%c",i,cnt==m ? '\n' : ' ');
- }
- }
- return 0;
- }
【Heap-dijkstra】Gym - 100923B - Por Costel and the Algorithm的更多相关文章
- 【找规律】Gym - 100923L - Por Costel and the Semipalindromes
semipal.in / semipal.out Por Costel the pig, our programmer in-training, has recently returned from ...
- 【分块打表】Gym - 100923K - Por Costel and the Firecracker
semipal.in / semipal.out Por Costel the pig, our programmer in-training, has recently returned from ...
- 【数形结合】Gym - 100923I - Por Costel and the Pairs
perechi3.in / perechi3.out We don't know how Por Costel the pig arrived at FMI's dance party. All we ...
- 【并查集】Gym - 100923H - Por Costel and the Match
meciul.in / meciul.out Oberyn Martell and Gregor Clegane are dueling in a trial by combat. The fight ...
- 【动态规划】Gym - 100923A - Por Costel and Azerah
azerah.in / azerah.out Por Costel the Pig has received a royal invitation to the palace of the Egg-E ...
- 【带权并查集】Gym - 100923H - Por Costel and the Match
裸题. 看之前的模版讲解吧,这里不再赘述了. #include<cstdio> #include<cstring> using namespace std; int fa[10 ...
- 【NOI导刊200908模拟试题02 题4】【二分+Dijkstra】 收费站
Description 在某个遥远的国家里,有n个城市.编号外1,2,3,-,n. 这个国家的政府修建了m条双向的通路.每条公路连接着两个城市.沿着某条公路,开车从一个城市到另一个城市,需要花费一定的 ...
- 【拓扑排序】【线段树】Gym - 101102K - Topological Sort
Consider a directed graph G of N nodes and all edges (u→v) such that u < v. It is clear that this ...
- 【每日dp】 Gym - 101889E Enigma 数位dp 记忆化搜索
题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的 ...
随机推荐
- HDU 1203 01背包
I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- a 标签中 title 属性样式修改
无文字描述,直接上测试页,看效果. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- jquery中的get和post、ajax有关返回值的问题描述
一:前言 今天我就要离开公司回学校准备考试,在走之前,我自己做的一个模块测试除了一些小的bug.问题如下 我在往数据库中插入数据,首先要选择一级菜单,接着会更具一级菜单生成一级菜单的子目录,在选择日期 ...
- L2-001. 紧急救援---(Dijkstra,记录路径)
https://www.patest.cn/contests/gplt/L2-001 L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 ...
- 【BZOJ】1579: [Usaco2009 Feb]Revamping Trails 道路升级
[算法]分层图最短路 [题解] 考虑k层一模一样的图,然后每个夹层都在每条边的位置新加从上一层跨越到下一层的边权为0的边,这样至多选择k条边置为0. 然后考虑方便的写法. SPFA 第一次SPFA计算 ...
- How to learn wxPython
目录 How to learn wxPython Learn Python Choose a good editor Install wxPython Read the wxPython tutori ...
- 转载:超级强大的vim配置(vimplus)--续集
超级强大的vim配置(vimplus)--续集 原文地址:https://www.cnblogs.com/highway-9/p/5984285.html An automatic configura ...
- easyUi根据一个日期给另一日期自动赋值的js
$('#loanbegindate').datebox({ onSelect:function(date){ changeDate(); } }); $('#loanterm,#loantermtyp ...
- CSS中的HSLA颜色
CSS 中的颜色可以由RGB色彩空间和HSL色彩空间两种方式来表述.其中我们常用的是RGB色彩空间,RGB色彩空间的颜色表示方式有:十六进制颜色(如红色:#FF0000).RGB颜色(如红色:rgb( ...
- elasticsearch SpanNearQuery inOrder参数
一直没有注意还有一个inOrder参数: public SpanNearQuery(SpanQuery[] clauses, int slop, boolean inOrder) When inOrd ...