题目:http://codeforces.com/contest/360/problem/E

官方题解与证明:http://codeforces.com/blog/entry/9529

一条可以调整的边的边权要么是 l [ i ] 要么是 r[ i ] 。

先把所有可调整边设成 r[ i ] ,然后看看有没有一条可调整的边 (x,y)满足 dis1[x]<=dis2[x] 且其边权还是 r[ i ];如果有,就把它改成 l [ i ]。

改完一条边之后就再做一遍 dij( ) ,然后再改;直到没有可改的边。

其实每次可以不止改一条边,可以把能改的边都改了。因为据证明,一条边 (x,y) 如果 dis1[x]<=dis2[x] ,不会在之后某次修改别的边的时候变成 dis1[x]>dis2[x] 了;所以一旦能改,就一直能改,所以一次改很多能改的边也是可以的。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #define ll long long
  6. using namespace std;
  7. const int N=1e4+,M=;
  8. int n,m,t,hd[N],xnt,bh[M],l[M],r[M],s1,s2,F;
  9. ll dis1[N],dis2[N];bool vis[N],ans[M];
  10. priority_queue<pair<ll,int> > q;
  11. struct Ed{
  12. int x,to,nxt,w;
  13. Ed(int f=,int a=,int b=,int c=):x(f),to(a),nxt(b),w(c) {}
  14. }ed[N+M];
  15. int rdn()
  16. {
  17. int ret=;bool fx=;char ch=getchar();
  18. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  19. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  20. return fx?ret:-ret;
  21. }
  22. void add(int x,int y,int z){ed[++xnt]=Ed(x,y,hd[x],z);hd[x]=xnt;}
  23. void dj()
  24. {
  25. memset(dis1,0x3f,sizeof dis1);dis1[s1]=;
  26. memset(vis,,sizeof vis);
  27. q.push(make_pair(,s1));
  28. while(q.size())
  29. {
  30. int k=q.top().second;q.pop();
  31. if(vis[k])continue;vis[k]=;
  32. for(int i=hd[k],v;i;i=ed[i].nxt)
  33. if(dis1[v=ed[i].to]>dis1[k]+ed[i].w)
  34. dis1[v]=dis1[k]+ed[i].w,q.push(make_pair(-dis1[v],v));
  35. }
  36. memset(dis2,0x3f,sizeof dis2);dis2[s2]=;
  37. memset(vis,,sizeof vis);
  38. q.push(make_pair(,s2));
  39. while(q.size())
  40. {
  41. int k=q.top().second;q.pop();
  42. if(vis[k])continue;vis[k]=;
  43. for(int i=hd[k],v;i;i=ed[i].nxt)
  44. if(dis2[v=ed[i].to]>dis2[k]+ed[i].w)
  45. dis2[v]=dis2[k]+ed[i].w,q.push(make_pair(-dis2[v],v));
  46. }
  47. }
  48. int main()
  49. {
  50. n=rdn();m=rdn();t=rdn();
  51. s1=rdn();s2=rdn();F=rdn();
  52. for(int i=,u,v,z;i<=m;i++)
  53. u=rdn(),v=rdn(),z=rdn(),add(u,v,z);
  54. for(int i=,u,v;i<=t;i++)
  55. {
  56. u=rdn();v=rdn();l[i]=rdn();r[i]=rdn();
  57. add(u,v,r[i]); bh[i]=xnt;
  58. }
  59. bool flag;
  60. while()
  61. {
  62. dj();flag=;
  63. for(int i=,d;i<=t;i++)
  64. {
  65. d=bh[i];
  66. if(ed[d].w==l[i]||dis1[ed[d].x]>dis2[ed[d].x])continue;
  67. ed[d].w=l[i];ans[i]=;flag=;
  68. }
  69. if(!flag)break;
  70. }
  71. dj();
  72. if(dis1[F]>dis2[F]){puts("LOSE");return ;}
  73. if(dis1[F]==dis2[F])puts("DRAW"); else puts("WIN");
  74. for(int i=;i<=t;i++)printf("%d ",ans[i]?l[i]:r[i]);puts("");
  75. return ;
  76. }

CF 360E Levko and Game——贪心的更多相关文章

  1. CF 360 E Levko and Game —— 贪心+最短路

    题目:http://codeforces.com/contest/360/problem/E 首先,每条边不是选 \( l[i] \) 就是选 \( r[i] \): 做法就是先把边权都设成 \( r ...

  2. CF #374 (Div. 2) D. 贪心,优先队列或set

    1.CF #374 (Div. 2)   D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优 ...

  3. CF 435B Pasha Maximizes(贪心)

    题目链接: [传送门][1] Pasha Maximizes time limit per test:1 second     memory limit per test:256 megabytes ...

  4. [CF #288-C] Anya and Ghosts (贪心)

    题目链接:http://codeforces.com/contest/508/problem/C 题目大意:给你三个数,m,t,r,代表晚上有m个幽灵,我有无限支蜡烛,每支蜡烛能够亮t秒,房间需要r支 ...

  5. cf 605A Sorting Railway Cars 贪心 简单题

    其实就是求总长度 - 一个最长“连续”自序列的长度 最长“连续”自序列即一个最长的lis,并且这个lis的值刚好是连续的,比如4,5,6... 遍历一遍,贪心就是了 遍历到第i个时,此时值为a[i], ...

  6. CF D. Walking Between Houses (贪心)

    题意: 现在有n个房子排成一列,编号为1~n,起初你在第1个房子里,现在你要进行k次移动,每次移动一都可以从一个房子i移动到另外一个其他的房子j里(i != j),移动的距离为|j - i|.问你进过 ...

  7. CodeForces 360E Levko and Game(Codeforces Round #210 (Div. 1))

    题意:有一些无向边m条权值是给定的k条权值在[l,r]区间可以由你来定,一个点s1 出发一个从s2出发  问s1 出发的能不能先打到f 思路:最短路. 首先检测能不能赢 在更新的时候  如果对于一条边 ...

  8. CF:322D - Ciel and Duel 贪心 或者 DP 我用的贪心 。。难道sort跟qsort是不一样的么?

    D. Ciel and Duel time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. cf D. Levko and Array

    http://codeforces.com/contest/361/problem/D 用二分搜索相邻两个数的差的绝对值,然后用dp记录数改变的次数.dp[i]表示在i之前改变的次数,如果|a[i]- ...

随机推荐

  1. 14.并发容器之ConcurrentHashMap(JDK 1.8版本)

    1.ConcurrentHashmap简介 在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hasht ...

  2. canvas图形的组合与裁切

    当两个或两个以上的图形存在重叠区域时,默认情况下一个图形画在前一个图像之上.通过指定图像globalCompositeOperation属性的值可以改变图形的绘制顺序或绘制方式,globalAlpha ...

  3. Ansible 小手册系列 十七(特性模块)

    异步操作和轮询 --- # Requires ansible 1.8+ - name: 'YUM - fire and forget task' yum: name=docker-io state=i ...

  4. 004-对象——public protected private PHP封装的实例

    <?php /** *public protected private PHP封装的实例 */ /*class tv { private $shengyin; function __constr ...

  5. SqlServer中存储过程 returnC#代码处理以及对应的MySQL如何改写

    一.SqlServer 中 1. 创建表 create table testuser( id int, --primary key, names ), address ), paw ) ) 2.创建存 ...

  6. nfs的简单搭建与原理

    nfs最大的缺点是单点,只能一对一nfs统称存储服务器,放视频图片之类的东西,所以服务器的容量很大数字都是放在数据库里边的, nfs的挂载原理 客户端怎么知道服务端的开启端口? 找rpcbind,再启 ...

  7. HDU 4704 Sum (隔板原理 + 费马小定理)

    Sum Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/131072K (Java/Other) Total Submiss ...

  8. Python基础学习----元组

    # 元组和列表的区别: # 相同点: # 1.表示多个元素的序列 # 2.数据之间用 , 分开 # 3.索引都是[0]开始 # # 不同点: # 1.列表创建是[],元组是()表示 # 2.元组元素一 ...

  9. New Concept English three(19)

    27w/m 76words Kidnappers are rarely interested in Animals, but they recently took considerable inter ...

  10. 3PC

    3PC,是Three-Phase Commit的缩写,即三阶段提交,是2PC的改进版,其二阶段提交协议的"提交事务请求"过程一分为二,形成了由CanCommit,PreCommit ...