最短路spfa POJ 1502 MPI Maelstrom

来源:互联网 发布:linux强制退出不保存 编辑:程序博客网 时间:2024/06/04 19:50

题意:一个信息站需要往其他信息站传输信息。当一个站接受到信息之后马上向跟它相连的信息站传输信息。已知没两个相连信息站之间传输时间。求:信息从第一个站传到每个站的最短时间。
思路:将传输代价作为路径长度,原来是求第一个信息站到其它所有信息站最短路径的最大值。
解法:用spfa,784K 0MS

#include<iostream>#include<cstdio>#include<vector>#include<cstring  >#include<queue>using namespace std;   const int MAX=205;  const int INF=2100000000;  bool vis[MAX];//判断是不是在队列中int dis[MAX],n,tmp,ans=-1;struct edge{    int to;    int w;    edge(int a=0,int b=0):to(a),w(b) {}};//存每个边的权值和指向的点vector<edge>E[MAX];void add(int from,int to,int w){    E[from].push_back(edge(to,w));}void spfa(){    queue<int> q;    q.push(1);    vis[1]=true;    int from,to;    while(!q.empty()){        from=q.front();//队首出队列        q.pop();        vis[from]=false;        for(int i=0;i<E[from].size();i++){            to=E[from][i].to;           if(dis[to]>dis[from]+E[from][i].w){//如果可以松弛                dis[to]=dis[from]+E[from][i].w;//进行松弛                if(!vis[to]){//如果不在队列里面                    vis[to]=true;//入队列                    q.push(to);                }            }        }    }}int main(){      freopen("i.txt","r",stdin);    cin>>n;    for(int i=2;i<=n;i++)dis[i]=INF,vis[i]=false;    char str[50];    int power[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000},len;    for(int i=2;i<=n;i++){        for(int j=1;j<i;j++){            scanf("%s",str);            tmp=0,len=0;            if(str[0]!='x') {                len=strlen(str);                for(int k=len-1;k>=0;k--)tmp+=power[len-1-k]*(str[k]-'0');//转换成数字                add(i,j,tmp);//由于是无向图,需要双向加边                add(j,i,tmp);           }        }    }    spfa();    for(int i=2;i<=n;i++) ans=ans>dis[i]?ans:dis[i];//寻找最大值    cout<<ans<<endl;    return 0;  }  
0 0
原创粉丝点击