zoukankan      html  css  js  c++  java
  • AW383 观光

    题目地址


    易错点:

    • 预处理时cnt[s][0]应当初始化为1.

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int MAXN=2e3,MAXM=2e4;
    struct Edge{
    	int from,to,w,nxt;
    }e[MAXM];
    int head[MAXN],edgeCnt=1;
    void addEdge(int u,int v,int w){
    	e[++edgeCnt].from=u;
    	e[edgeCnt].to=v;
    	e[edgeCnt].w=w;
    	e[edgeCnt].nxt=head[u];
    	head[u]=edgeCnt;
    }
    struct Node{
    	int v,dis;
    	bool operator <(Node another)const{
    		return dis>another.dis;
    	}
    };
    int s,t;
    int dis[MAXN][2],cnt[MAXN][2];
    int dijkstra(){
    	priority_queue<Node> q;
    	dis[s][0]=dis[s][1]=0;
    	cnt[s][0]=1;//
    	q.push(Node{s,0});
    	while(!q.empty()){
    		Node nowNode=q.top();q.pop();
    		int nowU=nowNode.v;
    		int k=-1;
    		if(dis[nowU][0]==nowNode.dis)k=0;
    		else if(dis[nowU][1]==nowNode.dis)k=1;
    		if(k==-1)continue;
    		for(int i=head[nowU];i;i=e[i].nxt){
    			int nowV=e[i].to,nowDis=nowNode.dis+e[i].w;
    			if(dis[nowV][0]>nowDis){
    				dis[nowV][1]=dis[nowV][0];
    				cnt[nowV][1]=cnt[nowV][0];
    				dis[nowV][0]=nowDis;
    				cnt[nowV][0]=cnt[nowU][0];
    				q.push(Node{nowV,nowDis});
    			}else if(dis[nowV][0]==nowDis){
    				cnt[nowV][0]+=cnt[nowU][0];
    			}else if(dis[nowV][1]>nowDis){
    				dis[nowV][1]=nowDis;
    				cnt[nowV][1]=cnt[nowU][k];
    				q.push(Node{nowV,nowDis});
    			}else if(dis[nowV][1]==nowDis){
    				cnt[nowV][1]+=cnt[nowU][k];
    			}
    		}
    	}
    	if(dis[t][0]==dis[t][1]-1)return cnt[t][0]+cnt[t][1];
    	return cnt[t][0];
    }
    void init(){
    	s=0,t=0;
    	memset(dis,0x3f,sizeof(dis));
    	memset(cnt,0,sizeof(cnt));
    	memset(head,0,sizeof(head));
    	edgeCnt=1;
    }
    int main(){
    	int T;
    	scanf("%d",&T);
    	while(T--){
    		init();
    		int n,m;
    		scanf("%d%d",&n,&m);
    		for(int i=1;i<=m;i++){
    			int u,v,w;
    			scanf("%d%d%d",&u,&v,&w);
    			addEdge(u,v,w);
    		}
    		scanf("%d%d",&s,&t);
    		int ans=dijkstra();
    		printf("%d
    ",ans);
    	}
    	return 0;
    } 
  • 相关阅读:
    易语言常用源码
    ci的数据库地址
    格式化输出php数组
    mysql插入表情问题
    线程、进程与协程2
    线程、进程与协程
    if __name=='__main__"的作用
    动态导入模块
    面向对象补充之方法
    getpass模块
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11680557.html
Copyright © 2011-2022 走看看