POJ1502-MPI Maelstrom
继续刷邝斌飞最短路专题
洛谷(POJ和vjudge都是1s,洛谷咋整了个3s)
题意主要就是:
1、所有点可以同时开始往能走的路上
2、A点如果走到B点了,B可以开始往下走,相当于携带了A所要传播的信息
这题逼逼一大堆我没理解错的话不就是找最短路径的最大值嘛?比如100个点,输出1到这99个点哪个最短距离最大。
(原题目只说是其余部分,洛谷多此一举写了个2~n+1行,tmd是下半部分!总共就1~n-1行,第一行输入个n后,其余部分应该是是2到n行)
起手堆优化迪杰斯特拉
写完返回CE,
1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 #include <stdlib.h> 5 #include<iostream> 6 using namespace std; 7 int map[101][101]; 8 struct Node{ 9 int num; 10 int expense; 11 };//发现结构体引用成员变量的时候,可以把之前写其他题目的时候那份代码里的成员变量带出来,比如这里就把weight带出来了 12 priority_queue<Node>q; 13 Node firstnode; 14 Node thisnode; 15 Node nextnode; 16 bool operator<(Node a ,Node b){ 17 return a.expense>b.expense; 18 } 19 int D[101]; 20 int main() 21 { 22 int n; 23 while(cin>>n){ 24 memset(map,0x3f,sizeof(map)); 25 memset(D,0x3f,sizeof(D)); 26 for(int i=2;i<=n;i++){ 27 for(int j=1;j<=(i-1);j++){ 28 string str; 29 cin>>str; 30 if(str=="x") 31 ; 32 if(str!="x"){ 33 int num=stoi(str); 34 map[i][j]=num; 35 map[j][i]=num; 36 } 37 } 38 }//输入数据完毕 39 firstnode.num=1; 40 firstnode.expense=0; 41 q.push(firstnode); 42 D[1]=0; 43 while(!q.empty()){ 44 thisnode=q.top(); 45 q.pop(); 46 for(int i=1;i<=n;i++){ 47 if(D[i]>D[thisnode.num]+map[thisnode.num][i]){ 48 D[i]=D[thisnode.num]+map[thisnode.num][i]; 49 nextnode.num=i; 50 nextnode.expense=D[i]; 51 q.push(nextnode); 52 } 53 } 54 } 55 int max=0; 56 for(int i=1;i<=n;i++){ 57 if(D[i]>max){ 58 max=D[i]; 59 } 60 } 61 cout<<max<<endl; 62 } 63 }
查博客说POJ不可以用stoi(这人手写了个string转int的,但只是字符,这里是字符串,并不适用)、(POJ其他CE也有是stoi引起的)
回顾之前Pots题目,int转string有to_string,但string转int没to_int,只能用stringstream,但记得需要释放内存(能不用就不用这个)。
关于string转int:
1、参考博客(ostringstream、istringstream、stringstream用法)
2、几种string转int的博客。里面关于c_str()之前有提过(特殊的表示法之前double/long博客)
我选择第二个,里面的atoi试试
提交惊呆了,一次AC,真的意外,居然这么简单
AC代码
1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 #include <stdlib.h> 5 #include<iostream> 6 using namespace std; 7 int map[101][101]; 8 struct Node{ 9 int num; 10 int expense; 11 };//发现结构体引用成员变量的时候,可以把之前写其他题目的时候那份代码里的成员变量带出来,比如这里就把weight带出来了 12 priority_queue<Node>q; 13 Node firstnode; 14 Node thisnode; 15 Node nextnode; 16 bool operator<(Node a ,Node b){ 17 return a.expense>b.expense; 18 } 19 int D[101]; 20 int main() 21 { 22 int n; 23 while(cin>>n){ 24 memset(map,0x3f,sizeof(map)); 25 memset(D,0x3f,sizeof(D)); 26 for(int i=2;i<=n;i++){ 27 for(int j=1;j<=(i-1);j++){ 28 string str; 29 cin>>str; 30 if(str=="x") 31 ; 32 if(str!="x"){ 33 int num=atoi(str.c_str()); 34 map[i][j]=num; 35 map[j][i]=num; 36 } 37 } 38 }//输入数据完毕 39 firstnode.num=1; 40 firstnode.expense=0; 41 q.push(firstnode); 42 D[1]=0; 43 while(!q.empty()){ 44 thisnode=q.top(); 45 q.pop(); 46 for(int i=1;i<=n;i++){ 47 if(D[i]>D[thisnode.num]+map[thisnode.num][i]){ 48 D[i]=D[thisnode.num]+map[thisnode.num][i]; 49 nextnode.num=i; 50 nextnode.expense=D[i]; 51 q.push(nextnode); 52 } 53 } 54 } 55 int max=0; 56 for(int i=1;i<=n;i++){ 57 if(D[i]>max){ 58 max=D[i]; 59 } 60 } 61 cout<<max<<endl; 62 } 63 }
犹如砍瓜切菜
###:string不读取空格
1 #include<string.h> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 string str; 7 cin>>str; 8 cout<<str<<endl; 9 } 10 //string不读取空格
###:发现个好用的快捷键,ctrl+点击是新页面打开