UESTC_方老师的分身 II CDOJ 915

方老师的分身 II

Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit Status

方老师计算出了走路时间最长的那个分身所用的时间。于是有个特殊的分身(据说是方老师真身!)就不想如此古板的走最短路了!由于这个分身的特殊性,这个分身对于单向边可以当双向边走。但是这个特殊的分身想走最短路的同时,要求至少经过k条边。

Input

有多组数据

第一行两个整数n,m(1≤n≤5000,1≤m≤100000)表示有n个教室,m条边。

接下来m行,每行3个数,u,v,t。表示u,v间有一条长度为t的边。

最后一行三个整数s,t,k,表示起点、终点、至少经过k(k≤50)条边。

Output

一个整数,表示最短路径长度。如果无解输出−1。

每组数据占一行。

Sample input and output

Sample Input Sample Output
4 4
1 2 1
2 3 2
1 3 100
3 4 1
1 3 5
7

Source

2014 UESTC Training for Graph Theory

解题报告:

还是跑SPFA,不过加了个经过的边数。。其他的跟SPFA一样的..

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
const int maxn = 5e3 + 50;
int mincost[maxn][50+5];
bool inqueue[maxn][50+5];

typedef struct Edge
{
  int target,cost;
  Edge(int target ,int cost)
   {
      this->target = target , this->cost = cost;
   }
};

typedef struct status
{
  int pos,step;
  status(int pos,int step)
   {
         this->pos = pos , this->step = step;
   }
};

queue<status>q;
vector<Edge>E[maxn];
int n,m,st,ed,k;

void bfs()
{
   mincost[st][0] = 0;
   q.push(status(st,0));
   while(!q.empty())
    {
       int pos = q.front().pos , step = q.front().step ; q.pop();
       int thiscost = mincost[pos][step];
       inqueue[pos][step] = false;
       for(int i = 0 ; i < E[pos].size() ; ++ i)
        {
           int nextnode = E[pos][i].target;
           int thisstep = min(52,step+1);
           if (mincost[nextnode][thisstep] == -1 || mincost[nextnode][thisstep] > thiscost + E[pos][i].cost)
            {
                mincost[nextnode][thisstep] = thiscost + E[pos][i].cost;
                if (!inqueue[nextnode][thisstep])
                 {
                     q.push(status(nextnode,thisstep));
                     inqueue[nextnode][thisstep] = true;
                 }
            }
        }
    }
}

int main(int argc,char *argv[])
{
  while(~scanf("%d%d",&n,&m))
   {
         memset(mincost,-1,sizeof(mincost));
         memset(inqueue,false,sizeof(inqueue));
         for(int i = 1 ; i <= m ; ++ i)
          {
                int u,v,t;
                scanf("%d%d%d",&u,&v,&t);
                E[u].pb(Edge(v,t));
                E[v].pb(Edge(u,t));
       }
      scanf("%d%d%d",&st,&ed,&k);
      bfs();
      int ans = mincost[ed][k];
      for(int i = k + 1 ; i <= 52 ; ++ i)
       if (mincost[ed][i] != -1)
        {
            if (ans == -1)
             ans = mincost[ed][i];
            ans = min (ans , mincost[ed][i]);
        }

      printf("%d\n",ans);
         for(int i = 1 ; i <= n ; ++ i)
          E[i].clear();
   }
  return 0;
}
时间: 2024-10-11 04:42:26

UESTC_方老师的分身 II CDOJ 915的相关文章

UESTC 915 方老师的分身II --最短路变形

即求从起点到终点至少走K条路的最短路径. 用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大于K条边的当做K条边来处理就好了.求最短路的三个算法都可以做,我这里用的是SPFA,比较简洁. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #incl

uestc 方老师的分身 II

题意:求s到t走过边数大于k的最短路 思路:邻接表实现,用w[u][e]来维护(看的大牛博客),u表示当前点,e表示已经经过多少条边.感觉有点类似DP. 在边数大于k的处理上,发现还是使之等于k(K<=50),节省存储空间. spfa算法实现. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string>

cdoj915-方老师的分身 II (长度不小于k的最短路)【spfa】

http://acm.uestc.edu.cn/#/problem/show/915 方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师计算出了走路时间最长的那个分身所用的时间.于是有个特殊的分身(据说是方老师真身!)就不想如此古板的走最短路了!由于这个分身的特殊性,这个分身对于单向边可以当双向边走.但是这个特殊的分身想走最

UESTC_方老师分身 I CDOJ 914

方老师分身 I Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师为了开更多讲座,于是他分身了!早上他都在某一个教室分身,然后各个分身分别赶去各个不同的n个教室(当然每个教室都要有且只有一个分身).晚上各个分身都赶回之前分身时的教室,合并成一个人(不需要同时回去).但是教室间的路十分崎岖,而且是单向的.当然即便只是方老师的分身,那也是相当厉害的,

UESTC 916 方老师的分身III --拓扑排序

做法: 如果有a<b的关系,则连一条a->b的有向边,连好所有边后,找入度为0的点作为起点,将其赋为最小的价值888,然后其所有能到的端点,价值加1,加入队列,删去上一个点,然后循环往复,直到队列为空,即每个点都赋予了一个权值为止. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #in

UESTC 914 方老师的分身I Dijkstra

题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以此题为求两次最短路. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Mod 100

UESTC 917 方老师的分身IV --求欧拉路径

判断欧拉路径是否存在及求出字典序最小的欧拉路径问题(如果存在). 将字符串的第一个字母和最后一个字母间连边,将字母看成点,最多可能有26个点(a-z),如果有欧拉路径,还要判断是否有欧拉回路,如果有,则需要找一个字典序最小的点开始生成这条链,否则以起点开始生成链,起点即为出度比入度大1的点. 欧拉路径是否存在的判定: 1.全部点在一个联通块                               ----用并查集判联通块的数量2.所有点出度入度相等                      

UESTC_方老师买表 CDOJ 885

老师买表 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 由于方老师出色的专题讲座,他的名气迅速扩散到全国各地,并通过各地的讲座赚到了很多钱,鉴于现在盛行买表,于是方老师带上了一个H×W的盒子去买表,我们假设每一个表占1×2或者2×1的空间,问方老师有多少种放置表的方式,把这个盒子填满. Input 输入有多组数据 每组数据占一行,每一行有2个正整数

UESTC_方老师和农场 2015 UESTC Training for Graph Theory&lt;Problem L&gt;

L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师重新开了一家农场,农场一共有N个节点和M条双向边,但是有一个很大的问题就是有比如一个农场A到达农场B只有一条路径,问至少添加多少条边使得任意两个农场之间的路径多于一条. Input 多组数据,EOF结束. 第1行:N和M. 第2到第M+1行:每一行2个数Ui和Vi,表示Ui到