http://acm.hdu.edu.cn/showproblem.php?pid=2112
map加dijkstra的应用
吗的开始2B了全部用的map写的,迭代器什么的都用上了,不超时才怪
其实把每个地址映射到一个点上就行了,然后dijkstra
不过还是WA了,TMD先是题目描述不清,以为是有向图,改了后还是WA
崩溃了,静下心来早原来一个判断里面直接continue 忘记对map清空了
map加dijkstra的应用
吗的开始2B了全部用的map写的,迭代器什么的都用上了,不超时才怪
其实把每个地址映射到一个点上就行了,然后dijkstra
不过还是WA了,TMD先是题目描述不清,以为是有向图,改了后还是WA
崩溃了,静下心来早原来一个判断里面直接continue 忘记对map清空了
这教训下次记住了
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stack>
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int maxn =10000001;
map<string,int> v;
const int MAXN=155;
int maps[MAXN][MAXN];
int d[MAXN];
int sign[MAXN];
int main()
{
int T;
while(scanf("%d",&T)!=EOF&&T!=-1)
{
char firsts[40];
char last[40];
memset(sign,0,sizeof(sign));
scanf("%s%s",firsts,last);
char a[40];
char b[40];
int len=1;
v[firsts]=len++;
v[last]=len++;
for(int i=1;i<MAXN;i++)
for(int j=1;j<MAXN;j++)
if(i==j)
maps[i][j]=0;
else
maps[i][j]=maps[j][i]=maxn;
for(int i=1;i<MAXN;i++)
d[i]=(i==1?0:maxn);
for(int i=1;i<=T;i++)
{
int w;
scanf("%s%s%d",a,b,&w);
if(v[a]==0)
v[a]=len++;
if(v[b]==0)
v[b]=len++;
maps[v[a]][v[b]]=min(maps[v[a]][v[b]],w);
maps[v[b]][v[a]]=min(maps[v[b]][v[a]],w);
}
if(strcmp(firsts,last)==0)
{
printf("0\n");
v.clear(); //此处忘记清空了,WA成狗了
continue;
}
int k;
for(int i=1;i<len;i++)
{
int mins=maxn;
for(int j=1;j<len;j++)
{
if(d[j]<=mins&&!sign[j])
{
k=j;
mins=d[j];
}
}
sign[k]=1;
for(int j=1;j<len;j++)
{
if(d[j]>d[k]+maps[k][j])
d[j]=d[k]+maps[k][j];
}
}
if(d[2]!=maxn)
printf("%d\n",d[2]);
else
printf("-1\n");
v.clear();
}
return 0;
}