求问分层图最短路哪里错了
查看原帖
求问分层图最短路哪里错了
141335
qwq2519楼主2021/8/27 19:59

样例过不了

#include<bits/stdc++.h>
#include<tuple>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
#define drp(i,j,k) for(register int i(j);i>=k;--i)
using namespace std;
typedef long long lxl;
template<typename T> 
inline T  max(T &a, T &b) {
	return a > b ? a : b;
}
template<typename T> 
inline T  min(T &a, T &b) {
	return a < b ? a : b;
}

inline char gt() {
	static char buf[1 << 21], *p1 = buf, *p2 = buf;
	return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
template <typename T>
inline void  read(T &x) {
	register char ch = gt();
	x = 0;
	int w(0);
	while(!(ch >= '0' && ch <= '9'))w |= ch == '-', ch = gt();
	while(ch >= '0' && ch <= '9')x = x * 10 + (ch & 15), ch = gt();
	w ? x = ~(x - 1) : x;
}
template <typename T>
inline void out(T x) {
	if(x < 0) x = -x, putchar('-');
	char ch[20];
	int num(0);
	while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
	while(num) putchar(ch[num--]);
	putchar(' ');
}
const int N=207;
const int M=N*N;
struct graph{
	int head[N],edge[M<<1],tot,next[M<<1],ver[M<<1],vlimit[M<<1];
	inline void add(int a,int b,int c,int d){
		ver[++tot]=b;
		next[tot]=head[a];
		edge[tot]=c;
		head[a]=tot;
		vlimit[tot]=d;
	}
}G;

int pre[N][507][5];

inline void print(int x,int v){
	cout<<"fuck";
	if(x!=1) print(pre[x][v][0],pre[x][v][1]);
	out(x-1);
}


int n,m,T;
double d[N][507];
bool vis[N][507];

#define tt tuple<double,int,int >
priority_queue< tt,vector<tt>,greater<tt> > q;//ʱ¼ä <Ëٶȣ¬¶¥µã> 
inline void Dijkstra(){
	
	rep(i,1,n)
		rep(j,0,500)
		d[i][j]=1e9;
	
	memset(vis,0,sizeof vis);
	
	d[1][70]=0.0;

	q.push(make_tuple(0.0,1,70));
	while(q.size()){
		int x=get<1>(q.top());
		int now_v=get<2>(q.top());
		q.pop();
		
		if(vis[x][now_v]) continue;
		vis[x][now_v]=1;
		
		for(register int i(G.head[x]);i;i=G.next[i]){
			int y(G.ver[i]),z(G.edge[i]),v(G.vlimit[i]);
			if(v){
			  if(d[y][v]>d[x][now_v]+1.0*z/v){
			  	d[y][v]=d[x][now_v]+1.0*z/v;
			  	pre[y][v][0]=x;
			  	pre[y][v][0]=v;
			    q.push(make_tuple(d[y][v],y,v));	  
			  }	
			}
			else{
				if(d[y][now_v]>d[x][now_v]+1.0*z/now_v){
					d[y][now_v]>d[x][now_v]+1.0*z/now_v;
					pre[y][now_v][0]=x;
					pre[y][now_v][1]=now_v;
				    q.push(make_tuple(d[y][now_v],y,now_v));					  
				}
			}
		}
	}
	int minn(0);
	rep(i,1,500){
		if(d[T][minn]>d[T][i]) minn=i;
	}
	cout<<minn<<endl;
	return;
	print(T,minn);
	return;
}



int main() {
	
    read(n);read(m);read(T);
    T++;
    int a,b,v,l;
    
    rep(i,1,m){
    	read(a);
    	read(b);
    	read(v);
    	read(l);
    	a++;
    	b++;	
    	G.add(a,b,l,v);
	}
    Dijkstra();
	return 0;
}
2021/8/27 19:59
加载中...