UVA 1599(p173)----Ideal Path

来源:互联网 发布:淘宝购物技巧大全 编辑:程序博客网 时间:2024/03/29 00:48
#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=100000+50;vector<int> g[maxn],cl[maxn];int dist[maxn],v[maxn],n,m,ans[maxn];void prepare(){    queue<int> q;    memset(dist,0x7f,sizeof(dist));    memset(v,0,sizeof(v));    v[n]=true;q.push(n);dist[n]=0;    while(!q.empty())    {        int now=q.front();        q.pop();        for(int i=0;i<g[now].size();i++)        {            int j=g[now][i];            if(dist[j]>dist[now]+1)            {                dist[j]=dist[now]+1;                if(!v[j])                {                    q.push(j);                    v[j]=true;                }            }        }       v[now]=false;    }}void solve(){    queue<int> q;    memset(v,0,sizeof(v));    v[1]=true;q.push(1);    while(!q.empty())    {        int now=q.front();        q.pop();        int flag=0;        for(int i=0;i<g[now].size();i++)        {            int j=g[now][i];            if(dist[j]+1==dist[now])            {                if(!flag)                    flag=cl[now][i];                else                    flag=min(flag,cl[now][i]);            }        }       int num=dist[1]-dist[now];       if(!ans[num]) ans[num]=flag;       else         ans[num]=min(ans[num],flag);       for(int i=0;i<g[now].size();i++)       {           int j=g[now][i];           if(!v[j]&&dist[j]+1==dist[now]&&cl[now][i]==flag)             {                 q.push(j);                 v[j]=true;             }       }    }}void init(int n){    for(int i=0;i<=n;i++)    {        g[i].clear();        cl[i].clear();    }    memset(ans,0,sizeof(ans));}int main(){   // freopen("in.in","r",stdin);    int x,y,c;    while(scanf("%d%d",&n,&m)==2&&n)    {        init(n);        for(int i=0;i<m;i++)        {            scanf("%d%d%d",&x,&y,&c);            if(x==y) continue;            g[x].push_back(y);            g[y].push_back(x);            cl[x].push_back(c);            cl[y].push_back(c);        }      prepare();      printf("%d\n",dist[1]);      solve();      for(int i=0;i<=dist[1]-2;i++)        printf("%d ",ans[i]);      printf("%d\n",ans[dist[1]-1]);    }    return 0;}

0 0
原创粉丝点击