zoukankan      html  css  js  c++  java
  • dijstra模板

    【代码】

    dijstra模板

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<queue>
    #include<set>
    using namespace std;
    #define f(i,n) for(int i=1;i<=(n);i++)
    #define ll long long
    #define INF 1<<30
    #define N 100010
    #define M 200010
    #define pi pair<int,int>
    #define mp make_pair
    int n,m;
    int read()
    {
     	int x=0,f=1;char c=getchar();
     	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
     	while( isdigit(c)){x=x*10+c-'0';c=getchar();}
     	return x*f;
    }
    struct xj
    {
    	int y;
    	int next;
    	int v;
    }map[2*M];
    int cnt;
    int head[N];
    void add_edge(int u,int v,int z)
    {
    	map[++cnt].y=v;
    	map[cnt].v=z;
    	map[cnt].next=head[u];
    	head[u]=cnt;
    }
    priority_queue<pi,vector<pi>,greater<pi> >q;
    int vis[N],dis[N];
    void dj()
    {
    	memset(vis,0,sizeof(vis));
    	f(i,n)dis[i]=INF;
    	while(q.size())q.pop();
    	dis[1]=0;
    	for(int i=head[1];i;i=map[i].next)
    	{
    		q.push(mp(map[i].v,map[i].y));
    		dis[map[i].y]=map[i].v;
    	}
    	while(q.size())
    	{
    		int v=q.top().second;
    		q.pop();
    		if(vis[v])continue;
    		vis[v]=1;
    		for(int i=head[v];i;i=map[i].next)
    		{
    			if(dis[map[i].y]>dis[v]+map[i].v)
    			{
    				dis[map[i].y]=dis[v]+map[i].v;
    				q.push(mp(dis[map[i].y],map[i].y));
    			}
    		}
    	}
    }
    int main()
    {
    	n=read();
    	m=read();
    	int u,v,z;
    	f(i,m)
    	{
    		u=read();
    		v=read();
    		z=read();
    	    add_edge(u,v,z);
    	    add_edge(v,u,z);
    	} 
    	dj(); 
    	f(i,n)printf("%d ",dis[i]);
    }
    
    
  • 相关阅读:
    Java
    Java
    Java
    Java
    NYOJ 127 星际之门(一)
    BNUOJ 1013 YC大牛的判题任务
    BNUOJ 1011 人工智能?
    HDU 1035 Robot Motion
    HDU 1214 圆桌会议
    NYOJ 86 找球号(一)
  • 原文地址:https://www.cnblogs.com/qwerfcxs/p/7807687.html
Copyright © 2011-2022 走看看