poj 1847

来源:互联网 发布:linux vim 保存 编辑:程序博客网 时间:2024/04/20 10:07

大致题意:现在有一铁路网络,有n个交叉点,和一些开关。通过开关可以改变路线方向,使其能驶向其他交叉点。开关的初始状态已知,即(初始直接某两点直接相连)。问从出发点到目的地最少要动多少开关才能到达。

最短路问题,开关初始状态边权为0,其他为1,这个条件转化比较有意思,深感智商不够用了。。

#include <iostream>#include <queue>using namespace std;#define inf 0x3f3f3f3fint g[110][110];int d[110],vis[110];int n,a,b;void dij(){    cin>>n>>a>>b; a--; b--;    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)            g[i][j]=inf;    for(int i=0;i<n;i++){        int k,m; cin>>k>>m; g[i][--m]=0;        for(int j=1;j<k;j++){            cin>>m; g[i][--m]=1;        }    }    for(int i=0;i<n;i++) d[i]=g[a][i];    vis[a]=1;    for(int k=1;k<n;k++){        int mind=inf,j;        for(int i=0;i<n;i++)            if(!vis[i] && d[i]<mind) mind=d[i],j=i;        vis[j]=1;        for(int i=0;i<n;i++)            if(!vis[i] && d[j]+g[j][i]<d[i]) d[i]=d[j]+g[j][i];    }    if(d[b]<inf) cout<<d[b]<<endl;    else cout<<-1<<endl;}/*struct edge{    int u,v,w;}e[10010];void bellford(){    cin>>n>>a>>b; a--; b--; int t=-1;    for(int i=0;i<n;i++){        int k,m; cin>>k>>m; e[++t].u=i; e[t].v=--m; e[t].w=0;        for(int j=1;j<k;j++){            cin>>m; e[++t].u=i; e[t].v=--m; e[t].w=1;        }    }    for(int i=0;i<n;i++) d[i]=inf;    d[a]=0;    for(int i=0;i<n;i++){        for(int j=0;j<=t;j++){            if(d[ e[j].u ]+e[j].w < d[ e[j].v ]) d[ e[j].v ]=d[ e[j].u ]+e[j].w;        }    }    if(d[b]<inf) cout<<d[b]<<endl;    else cout<<-1<<endl;}*/#define N 110struct Edge{    int v,w;}e[N*N];int root[N];int next[N*N];void spfa(){    queue<int> q;    cin>>n>>a>>b; a--; b--; int m=-1;    for(int i=0;i<n;i++) root[i]=-1;    for(int i=0;i<n;i++){        int k,y; cin>>k;        for(int j=0;j<k;j++){            cin>>y;            e[++m].v=--y;            e[m].w=(j||0);            next[m]=root[i];            root[i]=m;        }    }    for(int i=0;i<n;i++) d[i]=inf,vis[i]=0;    d[a]=0;    q.push(a);    while(!q.empty()){        int t=q.front();        q.pop(); vis[t]=0;        for(int i=root[t]; i!=-1; i=next[i]){            if( d[t]+e[i].w < d[ e[i].v ] ){                d[ e[i].v ]=d[t]+e[i].w;                if(!vis[ e[i].v ]){                    q.push(e[i].v); vis[ e[i].v ]=1;                }            }        }    }    if(d[b]<inf) cout<<d[b]<<endl;    else cout<<-1<<endl;}int main(){    //dij();    //bellford();    spfa();    return 0;}


 

原创粉丝点击