1089: 道路重建(dij 最短路径)

来源:互联网 发布:软件项目推广方案 编辑:程序博客网 时间:2024/05/19 05:04

原题链接
1089: 最短路入门2(道路重建)
时间限制: 1 Sec 内存限制: 128 MB
提交: 196 解决: 58
[提交][状态][讨论版]
题目描述
【题意】
从前有个王国,王国有N个城市,M条道路。两个城市之间最多只有一条道路。战争过后,有D条道路被摧毁了。国王想重建道路,使得最重要的两个城市A和B互通。
你的工作就是决定重建哪些道路能使得AB相连并且重建的道路的长度总和最少。
【输入格式】
本题有多组数据。
第一行为两个整数N,M(2 < N≤100,N-1≤M≤>N*(N-1)/2),城市的编号为1、2、3…N。
下来M行,每行三个整数x,y,c(1≤x,y≤N,x≠y,0

#include<iostream>#include<queue>using namespace std;typedef pair <int ,int > P ;const int INF=1<<29;int n,m;int _map[505][505];int distra[505][505];int vis[505];int len[505];void dij(int s){    for (int i=0;i<=n;i++)    {        vis[i]=0;        len[i]=INF;    }    len[s]=0;    priority_queue< P,vector <P> ,greater<P> > que;    que.push({len[s],s});    while(!que.empty())    {        P temp=que.top();        que.pop();        int num=temp.second;        if (vis[num]) continue;        vis[num]=1;        for (int i=1;i<=n;i++)        {            if (_map[num][i]!=INF)            {                if (len[i]>len[num]+_map[num][i])                {                    len[i]=len[num]+_map[num][i];                    que.push({len[i],i});                }            }        }    }}int main(){    int sum_len=0,x,y,I,J,c,D,start,last;   while( cin>>n>>m)//另外,此题有多组输入   {    for (int i=0;i<=n;i++)    {        for (int j=0;j<=n;j++)        {            _map[i][j]=INF;            distra[i][j]=0;        }    }    for (int i=0;i<m;i++)    {        cin>>x>>y>>c;        _map[x][y]=_map[y][x]= c;    }    cin>>D;    for (int i=0;i<D;i++)    {        cin>>I>>J;        distra[I][J]=distra[J][I]=1;    }    cin>>start>>last;    for (int i=1;i<=n;i++)//关键代码    //将没有被催毁的道路权值更新为0;    {        for (int j=1;j<=n;j++)        {            if (distra[i][j]==0&&_map[i][j]!=INF)            {                _map[i][j]=0;            }        }    }    dij(start);    cout<<len[last]<<endl;   }    return 0;}
原创粉丝点击