#include <unordered_map>
#include <iostream>
#include <string>
#include <list>
using namespace std;
struct node;
struct edge
{
node &to;
double weight;
edge(node &to,double weight):to(to),weight(weight) {}
};
struct node
{
string name;
list<edge> neighbors;
};
typedef unordered_map<string,node> graph;
node &find(graph &g,const string &name)
{
node &ret=g[name];
ret.name=name;
return ret;
}
void append(graph &g,const string &a,const string &b,double weight)
{
node &A=find(g,a),&B=find(g,b);
A.neighbors.push_back(edge(B,weight));
B.neighbors.push_back(edge(A,weight)); // jeżeli nieskierowany
}
int main()
{
graph g;
append(g,"Aleksandrow","Ksawerow",10);
append(g,"Aleksandrow","JanowLubelski",20);
append(g,"Zglowiaczka","Ksawerow",30);
append(g,"Ksawerow","Lodz",40);
append(g,"Lodz","Zakopane",50);
append(g,"Lodz","JanowLubelski",60);
append(g,"JanowLubelski","Lodz",70);
for(auto &node:g)
{
cout<<node.first<<endl;
for(auto &e:node.second.neighbors) cout<<'\t'<<e.to.name<<" -> "<<e.weight<<endl;
}
return 0;
}
I2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGxpc3Q+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3Qgbm9kZTsKc3RydWN0IGVkZ2UKICB7CiAgIG5vZGUgJnRvOwogICBkb3VibGUgd2VpZ2h0OwogICBlZGdlKG5vZGUgJnRvLGRvdWJsZSB3ZWlnaHQpOnRvKHRvKSx3ZWlnaHQod2VpZ2h0KSB7fQogIH07CnN0cnVjdCBub2RlCiAgewogICBzdHJpbmcgbmFtZTsKICAgbGlzdDxlZGdlPiBuZWlnaGJvcnM7CiAgfTsKdHlwZWRlZiB1bm9yZGVyZWRfbWFwPHN0cmluZyxub2RlPiBncmFwaDsKICAKbm9kZSAmZmluZChncmFwaCAmZyxjb25zdCBzdHJpbmcgJm5hbWUpCiAgewogICBub2RlICZyZXQ9Z1tuYW1lXTsKICAgcmV0Lm5hbWU9bmFtZTsKICAgcmV0dXJuIHJldDsKICB9Cgp2b2lkIGFwcGVuZChncmFwaCAmZyxjb25zdCBzdHJpbmcgJmEsY29uc3Qgc3RyaW5nICZiLGRvdWJsZSB3ZWlnaHQpCiAgeyAKICAgbm9kZSAmQT1maW5kKGcsYSksJkI9ZmluZChnLGIpOwogICBBLm5laWdoYm9ycy5wdXNoX2JhY2soZWRnZShCLHdlaWdodCkpOwogICBCLm5laWdoYm9ycy5wdXNoX2JhY2soZWRnZShBLHdlaWdodCkpOyAvLyBqZcW8ZWxpIG5pZXNraWVyb3dhbnkKICB9CgppbnQgbWFpbigpCiAgewogICBncmFwaCBnOwogICBhcHBlbmQoZywiQWxla3NhbmRyb3ciLCJLc2F3ZXJvdyIsMTApOwogICBhcHBlbmQoZywiQWxla3NhbmRyb3ciLCJKYW5vd0x1YmVsc2tpIiwyMCk7CiAgIGFwcGVuZChnLCJaZ2xvd2lhY3prYSIsIktzYXdlcm93IiwzMCk7CiAgIGFwcGVuZChnLCJLc2F3ZXJvdyIsIkxvZHoiLDQwKTsKICAgYXBwZW5kKGcsIkxvZHoiLCJaYWtvcGFuZSIsNTApOwogICBhcHBlbmQoZywiTG9keiIsIkphbm93THViZWxza2kiLDYwKTsKICAgYXBwZW5kKGcsIkphbm93THViZWxza2kiLCJMb2R6Iiw3MCk7CiAgIGZvcihhdXRvICZub2RlOmcpCiAgICAgewogICAgICBjb3V0PDxub2RlLmZpcnN0PDxlbmRsOwogICAgICBmb3IoYXV0byAmZTpub2RlLnNlY29uZC5uZWlnaGJvcnMpIGNvdXQ8PCdcdCc8PGUudG8ubmFtZTw8IiAtPiAiPDxlLndlaWdodDw8ZW5kbDsKICAgICB9CiAgIHJldHVybiAwOwogIH0=