hdu2112HDU Today trie+map

来源:互联网 发布:网络打印机的安装 编辑:程序博客网 时间:2024/05/16 19:16

trie

#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#include <queue>#include <cstring>#include <utility>#define MAXN 50010#define MAXM 50010using namespace std;int chd[MAXN][26];//存储节点编号int v[MAXN];//串尾节点标记//对于map<string,int>为int v[][]int ID[128];//每个字母的IDint 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 50010using 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;}


0 0
原创粉丝点击