spfa+队列+邻接表POJ3159

来源:互联网 发布:黑客破解软件授权 编辑:程序博客网 时间:2024/06/10 08:56
原题http://poj.org/problem?id=3159
#include <stdio.h>#include <string.h>#define VM 300005#define EM 1500005#define inf 0x3fint head[VM],ep;struct edge{    int v,w,next;}e[EM];void addedge(int cu,int cv,int cw){    ep ++;    e[ep].v = cv;    e[ep].w = cw;    e[ep].next = head[cu];    head[cu] = ep;}void spfa (int n){    int vis[VM],queue[VM],dis[VM];    memset (vis,0,sizeof(vis));    memset (dis,0x3f,sizeof(dis));    dis[1] = 0;    int front = -1,rear = 0;    queue[rear++] = 1;    vis[1] = 1;    while (front != rear)    {        front = (front+1)%(n+1);        int u = queue[front];        vis[u] = 0;        for (int i = head[u];i != -1;i = e[i].next)        {            if (dis[e[i].v] > dis[u]+e[i].w){dis[e[i].v] = dis[u]+e[i].w;if (!vis[e[i].v]){vis[e[i].v] = 1;queue[rear] = e[i].v;rear = (rear+1)%(n+1);}}        }    }    printf ("%d\n",dis[n]);}int main (){    int n,m,v1,v2,cost;    ep = 0;    memset (head,-1,sizeof(head));    scanf ("%d%d",&n,&m);    while (m--)    {        scanf ("%d%d%d",&v1,&v2,&cost);        addedge (v1,v2,cost);    }    spfa (n);    return 0;}//这题用这种方法会超时,要用栈

0 0
原创粉丝点击