HDU 4370 0 or 1 (최 단 로 djs)
4581 단어 최 단 로
제목
행렬 을 하나 드 리 겠 습 니 다. 0 과 1 로 구 성 된 행렬 을 찾 아 1. X12 + X13 +... X1n = 1 2. X1n + X2n +... Xn - 1n = 1 3. > Xki (1 < = k < = n) = > Xij (1 < = j < = n) 를 만족 시 킵 니 다.
문제 풀이 의 사고 방향.
수수께끼 같은 제목 의 뜻.전체적으로 행렬 을 그림 으로 보면 조건 1 은 노드 1 의 출 도 를 1 로 볼 수 있 고 조건 2 는 노드 n 의 입 점 을 1 로 볼 수 있 으 며 마지막 으로 조건 3 은 2 ~ n - 1 의 출 도 는 입 도 와 같다.위의 상황 을 만족 시 키 기 위해 1. 노드 1 에서 n 까지 의 가장 짧 은 길이 있다.2. 노드 1 은 자체 고 리 를 제외 한 고 리 를 찾 고 노드 n 은 자체 고 리 를 제외 한 고 리 를 찾는다.두 고리 의 총화.위의 두 가지 상황 중 하 나 는 조건 을 만족 시 키 는 최소 치 이다.
코드 부분
/// ( o(╥﹏╥)o)
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define LL long long
#define inf 0x3f3f3f3
const int N = 305;
int n,m;
int maps[N][N];
int dis[N];
int vis[N];
struct node
{
int i,dis;
friend bool operator < (node a,node b)
{
return a.dis > b.dis;
}
};
node add(int i,int dis)
{
node t;
t.i = i;
t.dis = dis;
return t;
}
void Dijkstra(int s)
{
priority_queueq;
for (int i =1; i <= n; i++)
{
if (i == s)
dis[i] = inf;
else
{
dis[i] = maps[s][i];
q.push(add(i,dis[i]));
}
vis[i] = 0;
}
while (!q.empty())
{
node t = q.top();
q.pop();
if (vis[t.i]) /// i
continue;
vis[t.i] = 1;
for (int i = 1; i <= n; i++)
{
if (dis[i] > dis[t.i]+maps[t.i][i] && !vis[i]) ///
{
dis[i] = dis[t.i]+maps[t.i][i];
q.push(add(i,dis[i]));
}
}
}
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
scanf("%d",&maps[i][j]);
}
Dijkstra(1);
int ans = dis[n];
int res = dis[1];
Dijkstra(n);
ans = min(ans,res+dis[n]);
printf("%d
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1233 또는 원활 한 공정 최소 생 성 트 리 (prim 알고리즘 + kruskal 알고리즘)그럼 이 연결 서브 맵 은 G 의 최소 생 성 트 리 입 니 다.최소 생 성 트 리 를 구 하 는 흔 한 알고리즘 은 Prim 알고리즘 입 니 다. 욕심 전략 을 사용 하기 때문에 집합 S 에 새로운 정점 을 추가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.