本来的代码hack了 #4 #5 #7
然后看了半天题解看不出什么猫腻 闲的没事看见题解的dij主体处循环写的比我的巧妙,就改了玩玩,歪打正着解决了问题
但是并不完全理解这俩为什么会导致结果不一,求问
(虽然直接背上就行了23333)
#include<bits/stdc++.h>
using namespace std;
const int Max=10005;
const int INF=2147483647;
int n,m,s;
unsigned int dis[Max];
struct node{
unsigned int nex,val;
};
vector <node> e[Max];
bool vis[Max];
int main(){
cin>>n>>m>>s;
for(int i=0;i<m;++i){
int uu;node vv;
cin>>uu>>vv.nex>>vv.val;
e[uu].push_back(vv);
}
for(int i=1;i<=n;++i)
dis[i]=INF;
for(int i=0;i<e[s].size();++i){
dis[e[s][i].nex]=e[s][i].val;
}
dis[s]=0;
int u=s;
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
while(!vis[u]){
unsigned int minn=INF;
for(int v=0;v<e[u].size();++v){
if(!vis[e[u][v].nex]&&dis[e[u][v].nex]>e[u][v].val+dis[u]){
dis[e[u][v].nex]=e[u][v].val+dis[u];
}
}
vis[u]=1;
for(int j=1;j<=n;++j){
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
u=j;
}
}
}
for(int i=1;i<=n;++i)
cout<<dis[i]<<' ';
// printf("%d ",dis[i]);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int Max=100005;
const int INF=2147483647;
int n,m,s;
unsigned int dis[Max];
struct node{
unsigned int nex,val;
};
vector <node> e[Max];
bool vis[Max];
int main(){
cin>>n>>m>>s;
for(int i=0;i<m;++i){
int uu;node vv;
cin>>uu>>vv.nex>>vv.val;
e[uu].push_back(vv);
}
for(int i=1;i<=n;++i)
dis[i]=INF;
for(int i=0;i<e[s].size();++i){
dis[e[s][i].nex]=e[s][i].val;
}
vis[s]=1,dis[s]=0;
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
for(int i=1;i<n;++i){
int min=INF,u=s;
for(int j=1;j<=n;++j){
if(!vis[j]&&dis[j]<min){
min=dis[j];
u=j;
}
}
vis[u]=1;
for(int v=0;v<e[u].size();++v){
if(dis[e[u][v].nex]>e[u][v].val+dis[u]){
dis[e[u][v].nex]=e[u][v].val+dis[u];
}
}
}
for(int i=1;i<=n;++i)
cout<<dis[i]<<' ';
// printf("%d ",dis[i]);
return 0;
}