HDU2112——HDU Today(map容器+spfa)

来源:互联网 发布:linux开发环境 编辑:程序博客网 时间:2024/05/22 12:20

难点:就是把字符串换成编号,用数组会超时,所以用map容器。其他的地方就和正常的spfa一样

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#define inf 100000000
using namespace std;
struct node
{
int next,to,weight;
}road[100050];
int head[10050];
int mark[10050];
int dis[10050];
int n;
char start[35];char en[35];
char s[35],e[35];int w;int cur,cut;
void init()
{
memset(road,0,sizeof(road));
memset(mark,0,sizeof(mark));
memset(start,'\0',sizeof(start));
memset(en,'\0',sizeof(en));
for(int i=0;i<n;i++)
{
head[i]=-1;
dis[i]=inf;
}
cur=1;cut=0;
}
void add(int a,int b,int c)
{
road[cut].weight=c;
road[cut].to=b;
road[cut].next=head[a];
head[a]=cut++;
}
void spfa(int u)
{
queue<int>q;
mark[u]=1;
dis[u]=0;
while(!q.empty()) q.pop();
q.push(u);
int i,l;
while(!q.empty())
{
l=q.front();
q.pop();
mark[l]=0;
for(i=head[l];i+1;i=road[i].next)
{
if(dis[l]+road[i].weight<dis[road[i].to])
{
dis[road[i].to]=dis[l]+road[i].weight;
if(mark[road[i].to]==0)
{
q.push(road[i].to);
mark[road[i].to]=1;
}
}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
if(n==-1) break;
map<string,int>mp;
scanf("%s%s",start,en);
if(mp[start]==0) mp[start]=cur++;
if(mp[en]==0) mp[en]=cur++;
for(int i=0;i<n;i++)
{
scanf("%s%s%d",s,e,&w);
if(mp[s]==0) mp[s]=cur++;
if(mp[e]==0) mp[e]=cur++;
int x=mp[s];int y=mp[e];
add(x,y,w);
add(y,x,w);
}
int xx=mp[start];int yy=mp[en];
if(xx==yy)
{
printf("0\n");
continue;
}
spfa(xx);
if(dis[yy]>=inf) printf("-1\n");
else printf("%d\n",dis[yy]);
}
return 0;
}


0 0
原创粉丝点击