您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dijkstra trie map