【hdu 2112】 HDU Today ( 最短路 Dijkstra)(map)
http://acm.hdu.edu.cn/showproblem.php?pid=2112
这道题给了一个将字符串与int对应的思路,就是使用map
这道题答案对了,但是没有AC,我也不知道为什么。。
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <vector>
#include <map>
using namespace std;
const int Ni = ;
const int INF = <<; typedef pair<int,int> pa; int dis[Ni],n;//dis使用1~n的部分 vector<pair<int,int> > eg[Ni]; void Dijkstra(int s)
{
int i,j;
cout<<n<<endl;
for(i=;i<=n;i++)//要到n
dis[i] = INF; priority_queue<pa>q; //优先级队列:小顶堆
dis[s] = ;
q.push(make_pair(s,dis[s]));
while(!q.empty())
{
pa x = q.top();
q.pop();
int w = x.first;
for(j = ;j<eg[w].size();j++)//遍历x的所有邻接点
{
pa y = eg[w][j];//y是x的邻接点
int u = y.first;
if(dis[u]>x.second+y.second)
{
dis[u] = x.second+y.second;
q.push(make_pair(u,dis[u]));
}
}
} } int main()
{
int m,d;//关系个数
string a,b;
map<string,int> mp;
while(cin>>n && n!=-)
{
mp.clear();
for(int i = ;i<=n;i++)
eg[i].clear();//初始化
cin>>a>>b;
bool flag = false;
if(a==b)
flag = true;
mp[a] = ;
mp[b] = ;
int k = ;
int w,u;
int t = n;
while(t--)
{
cin>>a>>b>>d;
if(!mp[a])
{
w = k;
mp[a] = k++;
}
if(!mp[b])
{
u = k;
mp[b] = k++;
}
eg[mp[a]].push_back(make_pair(mp[b],d));
eg[mp[b]].push_back(make_pair(mp[a],d));
}
if(flag)
{
cout<<"0\n";
continue;
}
Dijkstra();
if(dis[]!=INF)
cout<<dis[]<<endl;
else
cout<<"-1\n";
} return ;
}
第二次写,依旧WA
#include <cstdio>
#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <map>
using namespace std; #define MEM(a,v) memset (a,v,sizeof(a))
// a for address, v for value #define max(x,y) ((x)>(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y)) #define debug printf("!\n") const int L = ;
const int INF = <<; int n; struct node
{
int x,w; node(){}
node(int a,int b)
{ x= a;w =b;} bool operator <(const node& a) const
{
return w<a.w;
}
}; vector<node> va[L];
int dis[L]; void Dijkstra(int s)
{
int i;
for(i=;i<=n;i++)
dis[i] = INF; dis[s] = ; priority_queue<node> q;
q.push(node(s,dis[s])); while(!q.empty())
{
node t = q.top();
q.pop(); int x = t.x; for(i = ;i<va[x].size();i++)
{
node y = va[x][i];
if(dis[y.x]>y.w+t.w)
{
dis[y.x] = y.w+t.w;
q.push(node(y.x,dis[y.x]));
}
}
}
} int main()
{
int i,j; bool flag; char begin[],end[];
char c[],d[]; map<string,int> mp; int w,k; while(scanf("%d",&n)!=EOF && n!=-)
{ mp.clear(); for(i = ;i<=n;i++)
va[i].clear(); flag = false; scanf("%s%s",begin,end); if(strcmp(begin,end) == )
flag = true; mp[begin] = ;
mp[end] = ; k = ; for(i = ;i<n;i++)
{
scanf("%s%s%d",c,d,&w); if(!mp[c])
mp[c] = k++;
if(!mp[d])
mp[d] = k++; va[mp[c]].push_back(node(mp[d],w));
} if(flag)
{
printf("0\n");
continue;
}
Dijkstra();
if(dis[]!=INF)
printf("%d\n",dis[]);
else
printf("-1\n");
} return ;
}
UPDATE:
AC,780MS
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue #define INF 0x3f3f3f3f int n,k;
int g[][];//map
int vis[],d[];
char name[][],str1[],str2[]; int dijkstra(int v)
{
int i,j,min,dir;
for(i=;i<k;i++)
{
vis[i]=;
d[i]=g[v][i];
} vis[v] = ;
d[v]=; for(i = ;i<k;i++)
{
min = INF;
for(j=;j<k;j++)
{
if(!vis[j] && min>d[j])
{
min = d[j];
dir = j;
}
}
if(min==INF) break;
vis[dir]=;
for(j=;j<k;j++)
{
if(!vis[j] && d[j] > d[dir]+g[dir][j])
d[j] = d[dir]+g[dir][j];
}
}
return d[];
} int main()
{
int a,num1,num2,i,j;
while(sf("%d",&n)== && n!=-)
{
mem(g,);
sf("%s %s",name[],name[]);
k=;
for(i = ;i<n;i++)
{
sf("%s %s %d",str1,str2,&a);
for(j = ;j<k;j++)
{
if(strcmp(str1,name[j])==)
{
num1 = j;
break;
}
}
if(j==k)
{
num1 = k;
strcpy(name[k++],str1);
}
for(j = ;j<k;j++)
{
if(strcmp(str2,name[j])==)
{
num2 = j;
break;
}
}
if(j==k)
{
num2 = k;
strcpy(name[k++],str2);
}
if(g[num1][num2]>a)
g[num1][num2]=a;
if(g[num2][num1]>a)
g[num2][num1]=a; }
if(strcmp(name[],name[])==)
pf("0\n");
else
{
i = dijkstra();
if(i>=INF)
pf("-1\n");
else
pf("%d\n",i);
}
}
}
【hdu 2112】 HDU Today ( 最短路 Dijkstra)(map)的更多相关文章
- HDU 2112 HDU Today(Dijkstra)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others ...
- hdu 2112 HDU Today
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的 ...
- hdu 2112 HDU Today(map与dijkstra的结合使用)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 2112 HDU Today (Dijkstra算法)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 2112 HDU Today (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给出起点和终点,然后算出最短的路. 不过有好多细节要注意: (1)起始点和终止点相等的 ...
- HDU 2112 HDU Today(最短路径+map)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 2112 HDU Today(STL MAP + Djistra)
题目链接:HDU Today 立即集训要開始,抓紧时间练练手,最短路的基础题,第一次用STL的map 题目非常水,可是错了N遍.手贱了.本题不优点理的就是把地名转化为数字 #include <i ...
- ACM学习历程—HDU 2112 HDU Today(map && spfa && 优先队列)
Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线 ...
- HDU 2112 HDU Today 最短路
题目描述: Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这 ...
- hdu 2112(字典树+最短路)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- BZOJ 4719--天天爱跑步(LCA&差分)
4719: [Noip2016]天天爱跑步 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1464 Solved: 490[Submit][Stat ...
- html中设置data-*属性值 并在js中进行获取属性值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【javascrpt】——图片预览和上传,兼容IE 9-
下载DEMO:https://github.com/CaptainLiao/zujian/tree/master/Upload 对于现代浏览器来说,要实现图片预览非常简单: 1.fileReader. ...
- [Objective-C语言教程]Posing(29)
Posing,顾名思义,意思是“冒充”,它跟categories类似,但本质上不一样,Posing存在的目的在于子类可以冒充父类,使得后续的代码无需把父类修改为子类,就可以很方便的让父类表现成子类的行 ...
- Linux动态库的导出控制
在实际工作中,许多软件模块是以动态库的方式提供的.做为模块开发人员,我们不仅要掌握如何编写和构建动态库,还要了解如何控制动态库的导出接口,这样,我们可以向模块的用户仅导出必要的接口,而另一些内部接口, ...
- UDP的优点
UDP优点 关于何时.发送什么数据的应用层控制更为精细 只需要应用层把数据传给UDP,UDP就把数据打包到网络层.对于TCP来说,存在一个拥塞控制机制,当链路变得拥塞时,会抑制TCP发送方,并造成数据 ...
- day 28 :进程相关,进程池,锁,队列,生产者消费者模式
---恢复内容开始--- 前情提要: 一:进程Process 1:模块介绍 from multiprocessing import Process from multiprocessing impo ...
- 【Qt开发】实现系统托盘,托盘菜单,托盘消息
概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo ...
- JS实现值复制
在JS中对象一般都是传地址,后续修改也会影响原始数据.例如这样. var a={ b:"b" }; var c=a; c.b="c"; console.log( ...
- 2019.04.18 第六次训练 【2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage】
题目链接: https://codeforces.com/gym/101911 又补了set的一个知识点,erase(it)之后it这个地址就不存在了,再引用的话就会RE A: ✅ B: ✅ C: ...