bzoj2763 最短路
速度卡进第一页。。在我看来相当于拆点
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<vector> 7 #include<queue> 8 #define rep(i,l,r) for(int i=l;i<r;i++) 9 #define clr(a,x) memset(a,x,sizeof(a)) 10 using namespace std; 11 int read() 12 { 13 char c; 14 c=getchar(); 15 while(!isdigit(c)) c=getchar(); 16 int ans=0; 17 while(isdigit(c)){ 18 ans=ans*10+c-'0'; 19 c=getchar(); 20 } 21 return ans; 22 } 23 struct edge{ 24 int to,v; 25 }; 26 struct node{ 27 int num,d,f; 28 bool operator <(const node&q)const{ 29 return d>q.d; 30 } 31 }; 32 const int maxn=10005,maxm=50005,maxk=15; 33 int n,m,k,s,t,d[maxn][maxk]; 34 bool p[maxn][maxk]; 35 priority_queue<node>q; 36 vector<edge>e[maxn]; 37 int main() 38 { 39 clr(p,0); 40 node start; 41 start.d=0; 42 start.f=0; 43 n=read(); 44 m=read(); 45 k=read(); 46 start.num=read(); 47 int end=read(); 48 rep(i,0,n) 49 rep(j,0,k+1) 50 d[i][j]=10000000; 51 rep(i,0,k+1) d[start.num][i]=0; 52 rep(i,0,m){ 53 edge ed; 54 int from=read(); 55 ed.to=read(); 56 ed.v=read(); 57 e[from].push_back(ed); 58 swap(from,ed.to); 59 e[from].push_back(ed); 60 } 61 q.push(start); 62 int cnt=0; 63 while(!q.empty()){ 64 cnt++; 65 node now=q.top(); 66 q.pop(); 67 if(p[now.num][now.f]) continue; 68 p[now.num][now.f]=1; 69 p[now.num][now.f]=1; 70 rep(i,0,e[now.num].size()){ 71 if(now.d+e[now.num][i].v<d[e[now.num][i].to][now.f]){ 72 d[e[now.num][i].to][now.f]=now.d+e[now.num][i].v; 73 node next; 74 next.f=now.f; 75 next.d=d[e[now.num][i].to][now.f]; 76 next.num=e[now.num][i].to; 77 q.push(next); 78 } 79 if(now.d<d[e[now.num][i].to][now.f+1]){ 80 d[e[now.num][i].to][now.f+1]=now.d; 81 node next; 82 next.f=now.f+1; 83 next.d=now.d; 84 next.num=e[now.num][i].to; 85 q.push(next);; 86 } 87 } 88 } 89 printf("%d",d[end][k]); 90 return 0; 91 }
2763: [JLOI2011]飞行路线
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1080 Solved: 431
[Submit][Status][Discuss]
Description
Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格。Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机。那么Alice和Bob这次出行最少花费多少?
Input
数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数。
第二行有两个整数,s,t,分别表示他们出行的起点城市编号和终点城市编号。(0<=s,t<n)
接下来有m行,每行三个整数,a,b,c,表示存在一种航线,能从城市a到达城市b,或从城市b到达城市a,价格为c。(0<=a,b<n,a与b不相等,0<=c<=1000)
Output
只有一行,包含一个整数,为最少花费。
Sample Input
5 6 1
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100
Sample Output
8
HINT
对于30%的数据,2<=n<=50,1<=m<=300,k=0;
对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;
对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.