#include #include #include #include using namespace std; #define MAXN 1000 #define INF 0x3f3f3f3f int mp[MAXN][MAXN]; int dis[MAXN]; bool vis[MAXN]; int n,m,s; void dij(int from) { for(int i=1;i<=n;i++) { vis[i]=false; dis[i]=mp[from][i]; } vis[from]=1; for(int i=2;i<=n;i++) { int next=i; int minnext=INF; for(int j=1;j<=n;j++) { if(!vis[j]&&minnext>dis[j]) { next=j; minnext=dis[j]; } } vis[next]=true; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]>dis[next]+mp[next][j]) { dis[j]=dis[next]+mp[next][j]; } } } // queue bus; // bus.push(from); // dis[from]=0; // while(!bus.empty()) // { // int pos=bus.front(); // bus.pop(); // vis[pos]=true; // for(int i=1;i<=n;i++) // { // if(mp[pos][i]!=INF&&!vis[i]) // { // dis[i]=min(dis[i],dis[pos]+mp[pos][i]); // bus.push(i); // } // } // } } int main() { while(scanf("%d %d %d",&n,&m,&s)==3) { memset(mp,0x3f,sizeof(int)*MAXN*MAXN); for(int i=0; iw) mp[v][u]=w; } dij(s); int w; scanf("%d",&w); int mindis=INF; for(int i=0;i