一开始想的并查集(我一定是脑子坏掉了),晚上听学姐讲题才知道就是dijkstra两层;

题意:有一次机会能使一条边的权值变为原来的一半,询问从s到e的最短路。

将dis数组开成二维,第一维表示从源点到点i的路径长度,第二维表示是否使用了该次机会,并以此不断更新。

用map将字符串转为int,剩下的就是dijkstra+优先队列;

#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<queue>
#define ll long long
#define INF 1e18
using namespace std; const int N = 1e5+10;
const int M = 5e5+10;
int tot,m,n; struct Edge
{
int v, cost, next;
}edge[M]; struct qnode
{
int loc,level;
ll dis;
bool operator < (const qnode &t) const {
return dis > t. dis;
}
qnode(int a=0,int b=0,ll c=0){
loc=a,level=b,dis=c;
}
}d[N][2]; int head[M];
bool vis[N][2]; void addedge(int u, int v, ll w)
{
edge[tot]. v = v;
edge[tot]. cost = w;
edge[tot]. next = head[u];
head[u] = tot ++;
} void dijkstra(int st)
{
memset(vis, 0, sizeof(vis));
for(int i=1;i<=n;i++){
for(int j=0;j<=1;j++){
d[i][j].dis=INF;
}
}
d[st][0].dis = 0;
priority_queue <qnode> q;
q. push(qnode(st,0,0));
while(! q. empty()){
qnode t = q. top();
q. pop();
int t1=t.loc,t2=t.level;
if(vis[t1][t2])continue;
vis[t1][t2]=true;
for(int i = head[t1]; i != -1; i = edge[i]. next){
int v = edge[i]. v;
int cost = edge[i]. cost;
if( d[v][t2].dis > d[t1][t2].dis + cost){
d[v][t2].dis = d[t1][t2].dis + cost;
q. push(qnode(v,t2,d[v][t2].dis));
}
if(t2==0&&d[v][t2+1].dis>d[t1][t2].dis+cost/2){ //分别记录每一段是半价的价格
d[v][t2+1].dis=d[t1][t2].dis+cost/2;
q.push(qnode(v,t2+1,d[v][t2+1].dis));
}
}
}
} int main(){
while(scanf("%d%d", &n, &m)!=EOF){
string a,b;
map<string,int> cnt;
cnt.clear();
ll c;
tot = 1;
int k=1;
memset(head, -1, sizeof(head));
while(m --){
cin>>a>>b>>c;
if(!cnt[a])cnt[a]=k++;
if(!cnt[b])cnt[b]=k++;
addedge(cnt[a], cnt[b], c);
}
cin>>a>>b;
if(!cnt[a])cnt[a]=k++;
if(!cnt[b])cnt[b]=k++;
if(m==0) {
printf("-1\n");
continue;
}
dijkstra(cnt[a]);
ll ans=min(d[cnt[b]][0].dis,d[cnt[b]][1].dis);
if(ans==INF) printf("-1\n");
else printf("%lld\n",ans);
}
return 0;
}

最新文章

  1. nginx访问量统计
  2. can&#39;t connect to mysql server on &#39;localhost&#39;(10061)
  3. Linux随笔之——./configure、make、make install(转)
  4. 【皇甫】☀ 图_substring
  5. js阻止冒泡及jquery阻止事件冒泡示例介绍
  6. SQL中的charindex函数与reverse函数用法
  7. OneNote 2013 快捷键
  8. Mac OS X 卸载MySQL
  9. Leetcode 94. Binary Tree Inorder Traversal (中序遍历二叉树)
  10. C语言-02基本运算
  11. ODBC操作excel
  12. css3关键帧动画实现轮播效果
  13. tomcat启动批处理——catalina.bat
  14. andorid下从相册选取/拍照选取一张相片并剪切
  15. 【转】HashMap实现原理及源码分析
  16. Oracle安装部署之Win7下oracle11g数据库的安装及配置
  17. 通过超链接启动App
  18. setTimeout() 实现程序每隔一段时间自己主动运行
  19. HDU - 2089 不要62 (暴力或数位DP)
  20. Lintcode---把排序树组转换为高度最小的二叉树

热门文章

  1. python virtualenv 基本使用
  2. 9. 细节见真章,Formatter注册中心的设计很讨巧
  3. 使用idea插件识别log文件的相关设置
  4. USB限流IC,输入5V,输出5V,最大3A限流
  5. 三节锂电池充电管理芯片,IC电路图如何设计
  6. Spring Boot(IDEA,Gradle)超详细用户管理项目(一)——Hello World
  7. CSS3+JS完美实现放大镜模式
  8. MAX232数据方向
  9. 在OpenDaylight controller上开发App
  10. 你真的了解Android系统启动流程吗?Android高级工程师必看系列,已开源