//dijstra 时间复杂度n²(n为点,m为边)
#include<bits/stdc++.h>
using namespace std;
struct Node{
int y,v;
Node(int _y,int _v){
y = _y;
v = _v;
}
};
vector<Node> edge[1010];
int n,m,dist[1010];
int fi,se,lo;
int s,t;
bool b[1010];
int dijstra(int s,int t){
memset(b,false,sizeof(b));
memset(dist,127,sizeof(dist));
dist[s] = 0;
while(true){
int x = -1;
for(int i = 1;i <= n;i++){
if(!b[i] && dist[i] < 1 << 30){
if(x == -1 || dist[i] < dist[x]) x = i;
}
}
if(x == t || x == -1) break;
b[x] = true;
for(auto i : edge[x])
dist[i.y] = min(dist[i.y],dist[x] + i.v);
}
return dist[t];
}
int main(){
cin>>n>>m>>s>>t;
for(int i = 0;i<m;i++){
cin>>fi>>se>>lo;
edge[fi].push_back(Node(se,lo));
edge[se].push_back(Node(fi,lo));
}
cout<<dijstra(s,t)<<endl;
}
//堆优化dijstra 时间复杂度(n+m)logn(n为点,m为边)
#include<bits/stdc++.h>
using namespace std;
struct Node{
int y,v;
Node(int _y,int _v){
y = _y;
v = _v;
}
};
vector<Node> edge[1010];
set<pair<int,int> > q;
int n,m,dist[1010];
int fi,se,lo;
int s,t;
bool b[1010];
int dijstra(int s,int t){
memset(b,false,sizeof(b));
memset(dist,127,sizeof(dist));
dist[s] = 0;
q.clear();
for(int i = 1;i <= n; i++)
q.insert(make_pair(dist[i],i));
for(;!q.empty();){
int x = q.begin()->second;
q.erase(q.begin());
if(x == t || dist[x] > 1 << 30) break;
for(auto i : edge[x]){
if(dist[x] + i.v < dist[i.y]){
q.erase(make_pair(dist[i.y],i.y));
dist[i.y] = dist[x] + i.v;
q.insert(make_pair(dist[i.y],i.y));
}
}
}
return dist[t];
}
int main(){
cin>>n>>m>>s>>t;
for(int i = 0;i<m;i++){
cin>>fi>>se>>lo;
edge[fi].push_back(Node(se,lo));
edge[se].push_back(Node(fi,lo));
}
cout<<dijstra(s,t)<<endl;
}
//prim算法 时间复杂度n²+m(n为点,m为边)
#include<bits/stdc++.h>
using namespace std;
struct Node{
int y,v;
Node(int _y,int _v){
y = _y;
v = _v;
}
};
vector<Node> edge[1010];
set<pair<int,int> > q;
int n,m,dist[1010];
bool b[1010];
int prim(){
memset(b,false,sizeof(b));
memset(dist,127,sizeof(dist));
dist[1] = 0;
int ans = 0,tot = 0;
while(true){
int x = -1;
for(int i = 1;i<=n;i++){
if(!b[i] && dist[i] < 1<<30){
if(x == -1 || dist[i] < dist[x]) {
x = i;
}
}
}
if(x == -1) break;
++tot;
ans+=dist[x];
b[x] = true;
for(auto i : edge[x])
dist[i.y] = min(dist[i.y],i.v);
}
if(tot != n) return -1;
else return ans;
}
int main(){
cin>>n>>m>>s>>t;
for(int i = 0;i<m;i++){
cin>>fi>>se>>lo;
edge[fi].push_back(Node(se,lo));
edge[se].push_back(Node(fi,lo));
}
cout<<prim()<<endl;
}
//堆优化prim算法 时间复杂度(n+m)logn (n为点,m为边)
#include<bits/stdc++.h>
using namespace std;
struct Node{
int y,v;
Node(int _y,int _v){
y = _y;
v = _v;
}
};
vector<Node> edge[1010];
set<pair<int,int> > q;
int n,m,dist[1010];
bool b[1010];
int prim(){
memset(b,false,sizeof(b));
memset(dist,127,sizeof(dist));
dist[1] = 0;
q.clear();
for(int i = 1;i<=n;i++){
q.insert(make_pair(dist[i],i));
}
int ans = 0,tot = 0;
while(!q.empty()){
int x = q.begin()->second;
q.erase(q.begin());
if(dist[x] > 1 << 30) break;
++tot;
ans+=dist[x];
b[x] = true;
for(auto i : edge[x]){
if(!b[i.y] && i.v < dist[i.y]){
q.erase(make_pair(dist[i.y],i.y));
dist[i.y] = i.v;
q.insert(make_pair(dist[i.y],i.y));
}
}
}
if(tot != n) return -1;
else return ans;
}
int main(){
cin>>n>>m>>s>>t;
for(int i = 0;i<m;i++){
cin>>fi>>se>>lo;
edge[fi].push_back(Node(se,lo));
edge[se].push_back(Node(fi,lo));
}
cout<<prim()<<endl;
}
//kruscal算法 时间复杂度mlogn (n为点,m为边)
#include<bits/stdc++.h>
using namespace std;
struct Node{
int x,y,v;
bool operator < (const Node &A) const{
return v < A.v;
}
} a[10010];
int c;
int n,m,fa[1010];
int fi,se,lo;
int findset(int i){
if(i == fa[i]) return i;
return fa[i] = findset(fa[i]);
}
int kruskal(){
for(int i = 1;i<=n;i++){
fa[i] = i;
}
sort(a+1,a+m+1);
int ans = 0,cnt = n;
for(int i = 1;i<=m;i++){
int x = findset(a[i].x),y = findset(a[i].y);
if(x != y){
fa[x] = y;
ans += a[i].v;
--cnt;
}
if(cnt == 1) break;
}
if(cnt != 1) return -1;
else return ans;
}
int main(){
cin>>c>>m>>n;
for(int i = 1;i<=m;i++){
cin>>a[i].x>>a[i].y>>a[i].v;
}
if(kruskal() == -1 || kruskal() > c) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
//拓扑排序
#include<bits/stdc++.h>
using namespace std;
vector<int> edge[1010];
int n,m,q[1010],d[1010]; //d为每个点入度数量
int fi,se,lo;
inline void TopoSort(){
int front = 1,rear = 0;
for(int i = 1;i<=n;i++){
if(!d[i]) q[++rear] = i;
}
while(front <= rear){
int x = q[front];
++front;
for(auto y : edge[x]){
if(--d[y] == 0) q[++rear] = y;
}
}
if(rear == n){
printf("No\n");
}
else printf("Yes\n");
}
int main(){
cin>>m>>n;
for(int i = 1;i<=m;i++){
cin>>fi>>se;
edge[fi].push_back(se);
}
for(int i = 1;i<=n;i++){
d[i] = edge[i].size();
}
TopoSort();
}