poj1125之dijksrta

来源:互联网 发布:淘宝如何参加天天特价 编辑:程序博客网 时间:2024/06/15 23:08
/*1.对输入做出一定的处理,变成邻接矩阵,是有向图;2.假设1为源点,求出来1到所有点的最大值,然后以2为源点,求出来到所有的最大值,最后取其最小的值作为答案;3.要检查一下是否有不可达的点这个是maxmin,也就是最大值的最小值这个题用floyd会很方便但是性能上可能不如dijkstra*/#include <iostream>#include <vector>#include <queue>#include <utility>#define N 101#define Inifite 0x3fffffff#define pli pair<int,int>//length and indexusing namespace std;int edge[N][N],dist[N],flag[N];int numOfBrokers;void initial(){for (int i=1;i<=numOfBrokers;i++){for (int j=1;j<=numOfBrokers;j++){if(i==j)edge[i][j]=0;else edge[i][j]=Inifite;}}}void initialDijkstra(int start){for (int i=1;i<=numOfBrokers;++i)dist[i]=Inifite;memset(flag,0,sizeof(flag));dist[start]=0;flag[start]=1;}int findIndexOfMax(){int maxIndex=1;for (int i=2;i<=numOfBrokers;i++){if (dist[i]>dist[maxIndex])maxIndex=i;}return maxIndex;}int dijkstra(int start){initialDijkstra(start);priority_queue<pli,vector<pli>,greater<pli> > q;q.push(make_pair(0,start));while (!q.empty()){pli temp=q.top();q.pop();int minIndex=temp.second;int minlength=temp.first;flag[minIndex]=1;for (int i=1;i<=numOfBrokers;++i){if(!flag[i]&&dist[i]>dist[minIndex]+edge[minIndex][i]){dist[i]=dist[minIndex]+edge[minIndex][i];q.push(make_pair(dist[i],i));}}}return dist[findIndexOfMax()];}int main(){//freopen("in.txt","r",stdin);int from,to,costMinutes,j=1;while (cin >> numOfBrokers &&numOfBrokers){initial();//situation just like this:has many times inputs,remember initial some //necessary variations at first,especially counters or outputsint minLength=Inifite,minIndex=1,temp,j=1;//every time j will be set as 1;while (j<=numOfBrokers){int contracts,i=1;cin >> contracts;while (i<=contracts){from=j;cin >> to >> costMinutes;edge[from][to]=costMinutes;++i;}++j;}for (j=1;j<=numOfBrokers;++j){temp=dijkstra(j);if(temp<minLength){minLength=temp;minIndex=j;}}if(minLength<Inifite)cout << minIndex << " " << minLength << endl;else cout << "disjoint" << endl;}}

原创粉丝点击