hdu2112HDU Today trie+map
2014-08-20 23:26
411 查看
trie
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <utility>
#define MAXN 50010
#define MAXM 50010
using namespace std;
int chd[MAXN][26];//存储节点编号
int v[MAXN];//串尾节点标记//对于map<string,int>为int v[][]
int ID[128];//每个字母的ID
int sz,cnt;//节点数
void init1(){
memset(chd, 0, sizeof(chd));
memset(v, 0, sizeof(v));
sz= 1;
cnt=0;
for (int i = 0; i < 26; i++)
ID[i + 'a'] = i;
}
int Insert(char *s){
int cur=1;//标记是否存在
for(int i=0;s[i];++i){
if(!chd[cur][ID[s[i]]]){
chd[cur][ID[s[i]]]=++sz;
}
cur=chd[cur][ID[s[i]]];
}
if(v[cur] == 0){//重点=======
v[cur]= ++cnt;
}
return v[cur];
}
int n,m,s,t;
typedef pair<int ,int> PII;
struct edge {
int v, w;
edge *next;
void add(int y, int z, edge *&head){ v = y; w = z; next = head; head = this; }
}Te[MAXM*2],*Pe=Te,*head[MAXN*2];
void add_edge(int x, int y, int z) {
Pe++->add(y, z, head[x]);
}
int dist[MAXN];
bool visit[MAXN];
void dijkstra(int x) {
priority_queue<PII>q;
while (!q.empty()) q.pop();
memset(dist, 0x3f, sizeof(dist));
memset(visit, 0, sizeof(visit));
dist[x] = 0;
q.push(make_pair(0, x));
while (!q.empty()) {
while (!q.empty() && visit[q.top().second]) q.pop();
if (q.empty()) break;
PII t = q.top(); q.pop();
int i = t.second;
dist[i] = -t.first;
visit[i]=true;
for (edge *p = head[i]; p; p = p->next)
if (!visit[p->v]) q.push(make_pair(-(dist[i] + p->w), p->v));
}
}
void init()
{
init1();
memset(head,0,sizeof(head));
Pe=Te;
char s1[33],s2[33];
scanf(" %s %s",s1,s2);
s=Insert(s1);t=Insert(s2);
//cout<<s<<' '<<t<<endl;
for(int i=1;i<=n;i++)
{
int x,y,z;
scanf(" %s %s%d",s1,s2,&z);
x=Insert(s1);y=Insert(s2);
//printf(" %s:%d %s:%d %d\n",s1,x,s2,y,z);
add_edge(x,y,z);
add_edge(y,x,z);
}
}
int main()
{
while(scanf("%d",&n)&&n!=-1){
init();
if(s == t){cout<<0<<endl;continue;}
dijkstra(s);
cout<<(dist[t]==0x3f3f3f3f?-1:dist[t])<<endl;
}
return 0;
}
map
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <utility>
#include <map>
#include <string>
#define MAXN 50010
#define MAXM 50010
using namespace std;
map<string,int> mp;
int n,m,s,t;
typedef pair<int ,int> PII;
struct edge {
int v, w;
edge *next;
void add(int y, int z, edge *&head){ v = y; w = z; next = head; head = this; }
}Te[MAXM*2],*Pe=Te,*head[MAXN*2];
void add_edge(int x, int y, int z) {
Pe++->add(y, z, head[x]);
}
int dist[MAXN];
bool visit[MAXN];
void dijkstra(int x) {
priority_queue<PII>q;
while (!q.empty()) q.pop();
memset(dist, 0x3f, sizeof(dist));
memset(visit, 0, sizeof(visit));
dist[x] = 0;
q.push(make_pair(0, x));
while (!q.empty()) {
while (!q.empty() && visit[q.top().second]) q.pop();
if (q.empty()) break;
PII t = q.top(); q.pop();
int i = t.second;
dist[i] = -t.first;
visit[i]=true;
for (edge *p = head[i]; p; p = p->next)
if (!visit[p->v]) q.push(make_pair(-(dist[i] + p->w), p->v));
}
}
void init()
{
memset(head,0,sizeof(head));
Pe=Te;
mp.clear();
char s1[33],s2[33],s3[33],s4[33];
int cnt=1;
scanf(" %s %s",s1,s2);
s=mp[s1]=cnt++;
if(!mp[s2]) mp[s2]=cnt++;
t=mp[s2];
//cout<<s<<' '<<t<<endl;
for(int i=1;i<=n;i++)
{
int z;
scanf(" %s %s%d",s3,s4,&z);
if(!mp[s3])mp[s3]=cnt++;
if(!mp[s4])mp[s4]=cnt++;
//printf(" %s:%d %s:%d %d\n",s1,x,s2,y,z);
add_edge(mp[s3],mp[s4],z);
add_edge(mp[s4],mp[s3],z);
}
}
int main()
{
while(scanf("%d",&n)&&n!=-1){
init();
if(s == t){cout<<0<<endl;continue;}
dijkstra(s);
cout<<(dist[t]==0x3f3f3f3f?-1:dist[t])<<endl;
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <utility>
#define MAXN 50010
#define MAXM 50010
using namespace std;
int chd[MAXN][26];//存储节点编号
int v[MAXN];//串尾节点标记//对于map<string,int>为int v[][]
int ID[128];//每个字母的ID
int sz,cnt;//节点数
void init1(){
memset(chd, 0, sizeof(chd));
memset(v, 0, sizeof(v));
sz= 1;
cnt=0;
for (int i = 0; i < 26; i++)
ID[i + 'a'] = i;
}
int Insert(char *s){
int cur=1;//标记是否存在
for(int i=0;s[i];++i){
if(!chd[cur][ID[s[i]]]){
chd[cur][ID[s[i]]]=++sz;
}
cur=chd[cur][ID[s[i]]];
}
if(v[cur] == 0){//重点=======
v[cur]= ++cnt;
}
return v[cur];
}
int n,m,s,t;
typedef pair<int ,int> PII;
struct edge {
int v, w;
edge *next;
void add(int y, int z, edge *&head){ v = y; w = z; next = head; head = this; }
}Te[MAXM*2],*Pe=Te,*head[MAXN*2];
void add_edge(int x, int y, int z) {
Pe++->add(y, z, head[x]);
}
int dist[MAXN];
bool visit[MAXN];
void dijkstra(int x) {
priority_queue<PII>q;
while (!q.empty()) q.pop();
memset(dist, 0x3f, sizeof(dist));
memset(visit, 0, sizeof(visit));
dist[x] = 0;
q.push(make_pair(0, x));
while (!q.empty()) {
while (!q.empty() && visit[q.top().second]) q.pop();
if (q.empty()) break;
PII t = q.top(); q.pop();
int i = t.second;
dist[i] = -t.first;
visit[i]=true;
for (edge *p = head[i]; p; p = p->next)
if (!visit[p->v]) q.push(make_pair(-(dist[i] + p->w), p->v));
}
}
void init()
{
init1();
memset(head,0,sizeof(head));
Pe=Te;
char s1[33],s2[33];
scanf(" %s %s",s1,s2);
s=Insert(s1);t=Insert(s2);
//cout<<s<<' '<<t<<endl;
for(int i=1;i<=n;i++)
{
int x,y,z;
scanf(" %s %s%d",s1,s2,&z);
x=Insert(s1);y=Insert(s2);
//printf(" %s:%d %s:%d %d\n",s1,x,s2,y,z);
add_edge(x,y,z);
add_edge(y,x,z);
}
}
int main()
{
while(scanf("%d",&n)&&n!=-1){
init();
if(s == t){cout<<0<<endl;continue;}
dijkstra(s);
cout<<(dist[t]==0x3f3f3f3f?-1:dist[t])<<endl;
}
return 0;
}
map
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <utility>
#include <map>
#include <string>
#define MAXN 50010
#define MAXM 50010
using namespace std;
map<string,int> mp;
int n,m,s,t;
typedef pair<int ,int> PII;
struct edge {
int v, w;
edge *next;
void add(int y, int z, edge *&head){ v = y; w = z; next = head; head = this; }
}Te[MAXM*2],*Pe=Te,*head[MAXN*2];
void add_edge(int x, int y, int z) {
Pe++->add(y, z, head[x]);
}
int dist[MAXN];
bool visit[MAXN];
void dijkstra(int x) {
priority_queue<PII>q;
while (!q.empty()) q.pop();
memset(dist, 0x3f, sizeof(dist));
memset(visit, 0, sizeof(visit));
dist[x] = 0;
q.push(make_pair(0, x));
while (!q.empty()) {
while (!q.empty() && visit[q.top().second]) q.pop();
if (q.empty()) break;
PII t = q.top(); q.pop();
int i = t.second;
dist[i] = -t.first;
visit[i]=true;
for (edge *p = head[i]; p; p = p->next)
if (!visit[p->v]) q.push(make_pair(-(dist[i] + p->w), p->v));
}
}
void init()
{
memset(head,0,sizeof(head));
Pe=Te;
mp.clear();
char s1[33],s2[33],s3[33],s4[33];
int cnt=1;
scanf(" %s %s",s1,s2);
s=mp[s1]=cnt++;
if(!mp[s2]) mp[s2]=cnt++;
t=mp[s2];
//cout<<s<<' '<<t<<endl;
for(int i=1;i<=n;i++)
{
int z;
scanf(" %s %s%d",s3,s4,&z);
if(!mp[s3])mp[s3]=cnt++;
if(!mp[s4])mp[s4]=cnt++;
//printf(" %s:%d %s:%d %d\n",s1,x,s2,y,z);
add_edge(mp[s3],mp[s4],z);
add_edge(mp[s4],mp[s3],z);
}
}
int main()
{
while(scanf("%d",&n)&&n!=-1){
init();
if(s == t){cout<<0<<endl;continue;}
dijkstra(s);
cout<<(dist[t]==0x3f3f3f3f?-1:dist[t])<<endl;
}
return 0;
}
相关文章推荐
- Python中map()函数浅析
- Android使用Google Map浅谈
- jquery中map函数与each函数的区别实例介绍
- jquery与google map api结合使用 控件,监听器
- jquery遍历数组与筛选数组的方法
- 用json方式实现在 js 中建立一个map
- Android Map新用法:MapFragment应用介绍
- js Map List 遍历使用示例
- velocity显示List与Map的方法详细解析
- Google Map Api和GOOGLE Search Api整合实现代码
- Python Trie树实现字典排序
- 关于STL中的map容器的一些总结
- vector,map,list,queue的区别详细解析
- 浅析stl序列容器(map和set)的仿函数排序
- Java中List与Map初始化的一些写法分享
- Java用for循环Map详细解析
- 5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
- JAVA Map架构和API介绍
- list,set,map,数组之间的相互转换详细解析
- java map遍历的四种方法总结