江苏高速道路整合

来源:互联网 发布:软件可靠性测试内容 编辑:程序博客网 时间:2024/04/27 22:23

江苏省道路整合

江苏省高速公路师兄说大约有100来条的样子,然后他们刚开始分成小路段有14000+个路段,设计算法将其中的10000+合并了,还剩下3600+条道路需要合并。

1.MATLAB初选

我当时先采取了用matlab对其进行一些数据处理,在这个过程中,对各项数据都搞清楚了,毕竟是别人的数据,并不是别人一说就那么好理解的东西。用matlab构造出一些自己想要的数据。

然后对这个问题有所理解,当时对问题进行了梳理,然后抽象成如下的问题:

10000 个[x,y]对,其中x是集合A中的元素;y是集合B中的元素;A是B的子集。 如果某个[x,y]对与另一个[x,y]对中有元素相同,那么我们认为这两个对中的任何元素是可以相互表示的。 找出所有可以相互表示的元素集合。

这就是一个图找出所有连通分量的问题。

2.c++实现一个图找出所有连通分量

#include <iostream>#include <fstream>#include <vector>#include <cstring>using namespace std;const int M = 188719;const int MAXN = 30000;vector<int> v[MAXN+1];bool visited[MAXN+1];bool have[MAXN+1];void dfs(int x){    ofstream cout("out.txt", iostream::app);    cout<<" "<<x-M;    visited[x] = true;    int sz = v[x].size();    for(int i=0; i!=sz; ++i)        if(!visited[v[x][i]])            dfs(v[x][i]);}int main(){    ifstream cin("data.txt");    ofstream cout("out.txt", iostream::app);    memset(have, 0, sizeof(have));    int x, y;    while(cin>>x>>y)    {        have[x+M] = have[y+M] = true;        if(x!=y)        {            v[x+M].push_back(y+M);            v[y+M].push_back(x+M);        }    }    memset(visited, 0, sizeof(visited));    for(int i=1; i<=MAXN; ++i)    {        if(!visited[i]&&have[i])        {            cout<<"\nnew set:"<<endl;            dfs(i);        }    }    return 0;}

这个算法成功将3400+条道路合并到1000+道路。然而,目标是100左右。

3.josm+sublime text

1000多条道路怎么办呢?由于信息缺失,需要对照高德地图来进行拼接合并,所以使用josm进行暴力合并。

1 0
原创粉丝点击