hdu2112HDU Today trie+map

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章