20分求助谢谢
查看原帖
20分求助谢谢
240374
hicode_002楼主2020/11/6 08:52
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<climits>
#include<iterator>
using namespace std;
struct edge{
	int to,dis;
	edge(int tos=0,int diss=0):to(tos),dis(diss){}
};
long long dis[10005],inqueue[10005],outqueue[10005];
struct poi{
	int num;
	poi(int nus):num(nus){
	}
	bool operator <(const poi v1)const{
		return dis[num]>dis[v1.num] ;
	
	}
};
vector<edge>g[10005];
priority_queue<poi> edges;


int main(){
	memset(dis,0x7f,sizeof dis);
	memset(inqueue,0,sizeof inqueue);
	memset(outqueue,0,sizeof outqueue);
	int n,m,s;
	s=1;
	cin>>n>>m>>s;
	 for(int i=0;i<m;++i){
	 	int a,b,l;
	 	cin>>a>>b>>l;
	 	if(a==b)l=0;
		 
	 	g[a].push_back(edge(b,l)) ;
	 	
	 }
	 
	 for(int i=0;i<g[s].size() ;++i){
	 	dis[g[s][i].to]=g[s][i].dis;
	 }
	 dis[s]=0;
	 edges.push(poi(s)); 
	 while(!edges.empty() ){
	 		poi k=edges.top() ;
	 		edges.pop() ;
	 		outqueue[k.num ]++;
	 		for(int i=0;i<g[k.num].size() ;++i){
	 			int v=g[k.num][i].to;
	 			int ldis=g[k.num][i].dis;
	 			if(inqueue[v]<1){
	 				inqueue[v]++;
	 				if(dis[k.num]+ldis<dis[v]){
	 					dis[v]=dis[k.num]+ldis;
					 }
					 edges.push(poi(v)); 
				 }else{
				 	if(outqueue[v]<1){
				 		if(dis[k.num]+ldis<dis[v]){
	 					dis[v]=dis[k.num]+ldis;
					 }
					 }
				 }
				 
			 }
	 }
//	 if(dis[n]>1e9){
//	 	cout<<-1<<endl;
//	 	return 0;
//	 }
//	 cout<<dis[n]<<endl;
	 for(int i=1;i<=n;++i){
	 	if(dis[i]>1e9){
	 		cout<<INT_MAX<<" ";
	 		continue;
		 }
	 	cout<<dis[i]<<" ";
	 }
	 
	 
//	 cout<<endl;
	return 0;
}

为什么20分? 我写的堆优化 我的数组也开对了 为什么wa 求助

2020/11/6 08:52
加载中...