UVa1599,Ideal Path

 
说实话,这题参考的:

http://blog.csdn.net/u013382399/article/details/38227917

倒着BFS就把我难住了T T,原来这样倒着BFS一遍,遍历完所有的点后就能得到每一点到终点的最短距离啊(其实做完反思后仔细想了想,发现其实当第一次bfs到首节点时,该图已经遍历完成了),一开始没转过这个弯来T T,我直接调用了N次dfs(i)囧rz....

一开始我还想着吧color[]排序...这样更费时.....我写的dfs2()写着写着就乱了,本来思路还清晰,结果越写越乱T T...然后直接看的他的dfs2()

哎,和人家还有很大差距啊......虽然几乎是直接copy的人家的代码,但是做了深刻的反思,也深度的学习了他的代码与方法,算是学到了一些东西吧, 嘻嘻……至少比自己空领悟节约点时间嘛

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define maxn 100000+5
using namespace std;
vector<int> g[maxn];
vector<int> c[maxn];
int n,m,vis[maxn],d[maxn],ans[maxn];
int init(){
    int x,y;
    int temp;
    memset(vis,0,sizeof(vis));
    memset(d,0,sizeof(d));
    memset(ans,0,sizeof(ans));  
    for (int i=0;i<=n;i++)g[i].clear();
    for (int i=0;i<=n;i++)c[i].clear();
    for (int i=0;i<m;i++){
        cin>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
        cin>>temp;
        c[x].push_back(temp);
        c[y].push_back(temp);
    }
}
void bfs1(int n)  
{  
    memset(d,-1,sizeof(d));
    queue<int> q;  
    d[n]=0;  
    q.push(n);  
    while(!q.empty())  
    {  
        int u=q.front();q.pop();  
        int sz=g[u].size();  
        for(int v=0;v<sz;v++)  
        {  
            int vv=g[u][v];  
            if(vv==1)  
            {  
                d[1]=d[u]+1;  
                return;  
            }  
            if(d[vv]==-1)
            {  
                d[vv]=d[u]+1;  
                q.push(vv);  
            }  
        }  
    }  
    return;  
}  
void bfs2()  
{  
    memset(vis,0,sizeof(vis));  
    queue<int> q;  
    q.push(1);  
    while(!q.empty())  
    {  
        int u=q.front();q.pop();  
        if(d[u]==0) return;  
        int sz=g[u].size();  
        int mm=-1;  
        for(int i=0;i<sz;i++)//找到最小的颜色  
        {  
            int vv=g[u][i];  
            if(d[vv]==d[u]-1)  
            {  
                if(mm==-1)  
                    mm=c[u][i];  
                else  
                    mm=min(mm,c[u][i]);  
            }  
        }  
        int t=d[1]-d[u];  
        if(ans[t]==0) ans[t]=mm;  
        else  
            ans[t]=min(mm,ans[t]);  
        for(int v=0;v<sz;v++)  
        {  
            int vv=g[u][v];  
            if(vis[vv]==0&&d[vv]==d[u]-1&&c[u][v]==mm)  
            {  
                q.push(vv);  
                vis[vv]=1;  
            }  
        }  
    }  
    return;  
}  
int main()
{
    while (cin>>n>>m){
        init();
        bfs1(n);
        bfs2();
        printf("%d\n",d[1]);  
        for(int i=0;i<d[1];i++)  
        {  
            if(i) printf(" ");  
            printf("%d",ans[i]);  
        }  
        printf("\n");  
    }
}
View Code

 

posted @ 2014-07-28 16:47  ACBingo  阅读(568)  评论(0编辑  收藏  举报