Je n’ai pas réussi un point de test et la direction est un peu forte. Si vous ne comprenez pas, apprenez simplement la leçon.
//只看点数即可不要去看边数邻接矩阵法适用于稠密图,只要1000之内,用邻接表即可
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
const int inf=1000000000;
int _1,_2,m,range,distt,dsr[1010],visit[1010],t1,t2,index;
double avs[1010]={0},sum;
vector<int> pre[1010];
vector<double>minn,maxx;//找最大是判断是否有solution //vector入错类型会入不进去
string lll,rrr;
map<int,int>si;
map<int,int>is;
struct node{
int rr,dist;
};
vector<node>v[1010];
void out(){
index=0;
for(int j=0;j<minn.size();j++){
if(maxx[j]>range)minn[j]=-1;
}
for(int i=0;i<minn.size();i++){
if(minn[index]<minn[i]){
index=i;
}
else if(minn[index]==minn[i]&&avs[index]>avs[i]){
index=i;
}
else if(minn[index]==minn[i]&&avs[index]==avs[i]&&index>i){
index=i;
}
}
if(minn[index]==-1) printf("No Solution");
else {
printf("G%d\n",index+1);
printf("%.1lf %.1lf",minn[index],avs[index]);//第一个标弄错 minn声明的是int(注意)
}
}
int main(){
cin>>_1>>_2>>m>>range;
for(int i=1;i<=_2;i++){
si[i]=_1+i;
//is[_1+i]=[i];//输出时要带G
}
for(int i=0;i<m;i++){
cin>>lll>>rrr>>distt;
if(lll[0]=='G'){//string 的单字母是char型
t1=si[stoi(lll.substr(1))];//变量.substr
}
else t1=stoi(lll);
if(rrr[0]=='G'){
t2=si[stoi(rrr.substr(1))];
}
else t2=stoi(rrr);
v[t1].push_back({t2,distt});
v[t2].push_back({t1,distt});//太大了邻接表
}
for(int p=1;p<=_2;p++){
sum=0;
//fill(avs,avs+1010,1000000000.0);(过度重置将上一次值也覆盖)
fill(dsr,dsr+1010,inf);
fill(visit,visit+1010,0);
dsr[si[p]]=0;
int n=_1+_2;
for(int i=0;i<n;i++){
int u=-1,min=inf;
for(int j=1;j<=n;j++){
if(visit[j]==0&&dsr[j]<min){
min=dsr[j];
u=j;
}
}
if(u==-1) break;
visit[u]=1;
for(int a=0;a<v[u].size();a++){
node tempp=v[u][a];
if(visit[tempp.rr]==0){
if(dsr[u]+tempp.dist<dsr[tempp.rr]){
dsr[tempp.rr]=dsr[u]+tempp.dist;
pre[tempp.rr].clear();
pre[tempp.rr].push_back(u);
}
if(dsr[u]+tempp.dist==dsr[tempp.rr]){
pre[tempp.rr].push_back(u);
}
}
}
}
int ttt=inf;int temppp=0;
for(int q=1;q<=_1;q++){
if(dsr[q]<ttt) ttt=dsr[q];
}
//debug
//for(int i=1;i<=_1;i++){
// printf("%d ",dsr[i]);
// }
//printf("\n");
//printf("%d\n",ttt);
minn.push_back(ttt);//如果直接循环找值就不用想数据存储的的事了 (注意)
for(int l=1;l<=_1;l++){
sum+=1.0*dsr[l];
}
avs[p-1]= sum/(_1);
//debug
//printf("%f %d",avs[p-1],sum); //3.25??
for(int ll=1;ll<=_1;ll++){
if(dsr[ll]>temppp){
temppp=dsr[ll];//ll 写成11以后拒绝这种错误命名时尽量避免一些与数字非常像的字母ll啦(注意)
}
}
maxx.push_back(temppp);
}
//debug
//for(int i=0;i<minn.size();i++)
//printf("%d ",minn[i]);
out();
return 0;
}
Résumé: 1. Ne pas utiliser ll, facile à mélanger avec 11
2. Il s'agit d'une comparaison multi-source, pas d'une situation multiple à source unique. Au début, le jugement était erroné et beaucoup d'énergie a été gaspillée. Si vous voulez savoir quel est le résultat, vous n'avez pas besoin de dfs si n peut être déterminé en moyenne.
3. Réinitialisation excessive de la condition, entraînant l'écrasement du résultat précédent
4. Si vous recherchez uniquement la meilleure valeur, essayez de rechercher sans stocker les résultats, ce qui est plus simple et moins sujet aux erreurs.
5. Le type de variable appliqué est incompatible avec le type de sortie et la sortie naturelle est 0
6. Ne cherchez pas simplement ces quantités si vous pensez que c'est trop compliqué
Si le nombre de nœuds est inférieur ou égal à 1 000, utilisez la matrice de contiguïté. Ne contrôlez pas le nombre d'arêtes. Elle convient aux graphes denses.
Anglais non
Problème L'algorithme de Dijkstra est lent à écrire, à écrire plus et à écrire plus précisément sous diverses formes