UVa 10986 - Sending email

来源:互联网 发布:初中数学教学软件 编辑:程序博客网 时间:2024/06/08 02:09

链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1927

//邻接表+队列

#include <iostream>#include <string.h>#include <queue>#include <stdio.h>using namespace std;#define edge_max 100005#define vertex_max 100005const int inf = (1<<20);struct Node{    int u,w;    int next;}Edge[edge_max];int pre[vertex_max],dist[vertex_max]; //以p[i]的i为起点储存的边数序号int n,m,start,stop; //顶点数,边数 起点,终点bool vis[vertex_max]; //记录void init(){    memset(pre,-1,sizeof(pre));    int index=1;    int v,u,w;    for(int i=0;i<m;i++)    {        scanf("%d%d%d",&v,&u,&w);        Edge[index].u=u;        Edge[index].w=w;        Edge[index].next=pre[v];        pre[v]=index++;        swap(v,u);        Edge[index].u=u;        Edge[index].w=w;        Edge[index].next=pre[v];        pre[v]=index++;    }}void spfa(int v){    queue <int> q;    fill(dist,dist+n,inf);    memset(vis,0,sizeof(vis));    dist[v]=0;    vis[v]=1;    while(!q.empty())        q.pop();    q.push(v);    while(!q.empty())    {        int top=q.front();        q.pop();        vis[top]=0;        for(int i=pre[top];i!=-1;i=Edge[i].next)        {            int e=Edge[i].u;            if(dist[e]>dist[top]+Edge[i].w)            {                dist[e]=dist[top]+Edge[i].w;                if(!vis[e])                {                    q.push(e);                    vis[e]=1;                }            }        }    }}int main(){    int t,cnt=1;    scanf("%d",&t);    while(t--)    {        scanf("%d%d%d%d",&n,&m,&start,&stop);        init();        spfa(start);        printf("Case #%d: ",cnt++);        if(dist[stop]!=inf)            printf("%d\n",dist[stop]);        else            printf("unreachable\n");    }    return 0;}


0 0